美文网首页
自定义模式切换

自定义模式切换

作者: liangtong | 来源:发表于2019-01-23 15:17 被阅读0次

描述

ALE中,地图定位模式包括普通导览模式、普通定位模式、普通指向模式、导航模式、导航指向模式、导航导览模式。
模式切换的时机有两种:点击模式切换按钮、操作地图画面。

  • 点击模式切换按钮时,地图模式如下变换、
    • 普通导览模式 ⇀ 普通定位模式 ⇌ 普通指向模式
    • 导航导览模式 ⇀ 导航模式 ⇌ 导航指向模式
  • 操作地图时,地图模式如下变换
    • 普通定位模式/普通指向模式 ⇀ 普通导览模式
    • 导航模式/导航指向模式 ⇀ 导航导览模式

状态流转参照下图

ccs_map_state_20161121.png

方案

使用 状态模式 来实现状态流转。
使用 观察者模式 来监听状态变化,并根据具体的地图模式进行特定的UI展现。

地图基础状态中除了包含一个表示地图模式的属性外,还包含具体流转定义两种操作方法,分别对应点击模式切换按钮和操作地图。

@class EepMSVGMapMode;
//地图模式基类
@interface EepMSVGMapDisplayModeState : NSObject
@property (nonatomic, assign) EepMSVGMapDisplayMode mapMode;//地图模式的属性
-(void)handleMapWithContext:(EepMSVGMapMode*)context;//操作地图
-(void)modeSwitchWithContext:(EepMSVGMapMode*)context;//按钮切换模式
@end

业务中的具体模式继承基础状态模式,重写两种操作对应的流转方法,修改相应的属性值。比如导航普通模式的实现细节如下:

//导航-普通模式
@implementation EepMSVGMapDisplayModeNavigationNormalState
-(instancetype)init{
    self = [super init];
    self.mapMode = EepMSVGMapDisplayModeNavigationNormal;
    return self;
}
-(void)handleMapWithContext:(EepMSVGMapMode*)context{
    context.mapState = [[EepMSVGMapDisplayModeNavigationTourGuideState alloc] init];
}
-(void)modeSwitchWithContext:(EepMSVGMapMode*)context{
    context.mapState = [[EepMSVGMapDisplayModeNavigationDirectionState alloc] init];
}
@end

此处需要注意的是普通导览模式和导航导览模式下,操作地图的时候,地图模式不会发生变更,两个状态对应的实现类可以将 handleMapWithContext: 方法hook,或者干脆不重写该方法

对外通过以下访问形式;调用者不需要关心当前模式是什么,只需要在点击模式切换时和操作地图时,调用特定名称的方法即可。

/**
 *  地图展示
 **/
@interface EepMSVGMapMode : NSObject

@property (nonatomic,strong) EepMSVGMapDisplayModeState* mapState;
+(instancetype)sharedInstance;
-(void)setMapMode:(EepMSVGMapDisplayMode)mapMode;
//当前地图模式
-(EepMSVGMapDisplayMode)currentMapMode;
//操作地图
-(void)handleMap;
//点击了模式切换按钮
-(void)modeSwitch;
@end

实现相当简单,比如对于操作地图接口,只需要调用当前状态的 handleMapWithContext:方法即可。

-(void)handleMap{
    [self.mapState handleMapWithContext:self];
    [[NSNotificationCenter defaultCenter] lt_postNotificationOnMainThreadName:ALEMapDisplayModeChangeKey object:nil];
}

相关文章

  • Lauchpad X | 模式

    1、Custom 自定义模式 1)按下Custom按钮,进入该模式2)按压右侧前4个场景按钮,切换自定义布局3)默...

  • 界面换肤笔记

    界面换肤的两种实现方式 1.主题切换模式 创建两种主题模式 自定义属性 应用样式,通过?attr/去引用样式 切换...

  • 自定义模式切换

    描述 ALE中,地图定位模式包括普通导览模式、普通定位模式、普通指向模式、导航模式、导航指向模式、导航导览模式。模...

  • iOS swift暗黑模式适配

    暗黑模式适配 跟随系统 自定义切换 具体ui可以自己话,下面是简单的点击swtich事件 颜色设置代码 Scene...

  • iOS Xcode 的汇编模式切换

    iOS Xcode 的汇编模式切换 iOS Xcode 的汇编模式切换

  • Jupyter notebook快捷键

    一. Jupyter notebook的两种模式 命令模式 编辑模式 如何切换模式? 从编辑模式切换到命令模式:在...

  • 自定义NSLog打印日志

    用自定义的DLog代替NSLog,在Debug模式下就会输出信息,包括方法名,行数及你想要输出的内容,但是只要切换...

  • iOS swift 自定义页面的切换动画与交互动画

    参照:iOS 自定义页面的切换动画与交互动画 By Swiftoc 版切换动画 一、自定义导航栏的Push/Pop...

  • 轮播单边、循环模式切换写法

    轮播单边、循环模式切换基本写法 轮播单边、循环模式切换优化写法

  • Android音乐播放模式切换-外放、听筒、耳机

    初始化音频管理器 切换到听筒模式 切换到耳机模式 切换到外放模式 设置音量 音量+/-按钮触发 FLAG_SHOW...

网友评论

      本文标题:自定义模式切换

      本文链接:https://www.haomeiwen.com/subject/vnojjqtx.html