自定义模式切换

描述

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];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,278评论 4 61
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,835评论 1 32
  • 接连半月在办公室以外来回跑,做一些之前并未接触过的事情,这中间有谨言慎行、有各种虐心,有冲突、有被玩弄、有精神崩溃...
    臻静阅读 1,820评论 8 2
  • 【奇迹30-20班 晚课】精华分享 金钱不过就是一场频率游戏 灵修~ 第一阶段:持续清理的过程 第二阶段:形成全新...
    四月天儿0315阅读 3,856评论 0 0