自定義模式切換

描述

ALE中,地圖定位模式包括普通導(dǎo)覽模式、普通定位模式、普通指向模式、導(dǎo)航模式、導(dǎo)航指向模式、導(dǎo)航導(dǎo)覽模式。
模式切換的時(shí)機(jī)有兩種:點(diǎn)擊模式切換按鈕、操作地圖畫面。

  • 點(diǎn)擊模式切換按鈕時(shí),地圖模式如下變換、
    • 普通導(dǎo)覽模式 ? 普通定位模式 ? 普通指向模式
    • 導(dǎo)航導(dǎo)覽模式 ? 導(dǎo)航模式 ? 導(dǎo)航指向模式
  • 操作地圖時(shí),地圖模式如下變換
    • 普通定位模式/普通指向模式 ? 普通導(dǎo)覽模式
    • 導(dǎo)航模式/導(dǎo)航指向模式 ? 導(dǎo)航導(dǎo)覽模式

狀態(tài)流轉(zhuǎn)參照下圖

ccs_map_state_20161121.png

方案

使用 狀態(tài)模式 來(lái)實(shí)現(xiàn)狀態(tài)流轉(zhuǎn)。
使用 觀察者模式 來(lái)監(jiān)聽狀態(tài)變化,并根據(jù)具體的地圖模式進(jìn)行特定的UI展現(xiàn)。

地圖基礎(chǔ)狀態(tài)中除了包含一個(gè)表示地圖模式的屬性外,還包含具體流轉(zhuǎn)定義兩種操作方法,分別對(duì)應(yīng)點(diǎn)擊模式切換按鈕和操作地圖。

@class EepMSVGMapMode;
//地圖模式基類
@interface EepMSVGMapDisplayModeState : NSObject
@property (nonatomic, assign) EepMSVGMapDisplayMode mapMode;//地圖模式的屬性
-(void)handleMapWithContext:(EepMSVGMapMode*)context;//操作地圖
-(void)modeSwitchWithContext:(EepMSVGMapMode*)context;//按鈕切換模式
@end

業(yè)務(wù)中的具體模式繼承基礎(chǔ)狀態(tài)模式,重寫兩種操作對(duì)應(yīng)的流轉(zhuǎn)方法,修改相應(yīng)的屬性值。比如導(dǎo)航普通模式的實(shí)現(xiàn)細(xì)節(jié)如下:

//導(dǎo)航-普通模式
@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

此處需要注意的是普通導(dǎo)覽模式和導(dǎo)航導(dǎo)覽模式下,操作地圖的時(shí)候,地圖模式不會(huì)發(fā)生變更,兩個(gè)狀態(tài)對(duì)應(yīng)的實(shí)現(xiàn)類可以將 handleMapWithContext: 方法hook,或者干脆不重寫該方法

對(duì)外通過(guò)以下訪問(wèn)形式;調(diào)用者不需要關(guān)心當(dāng)前模式是什么,只需要在點(diǎn)擊模式切換時(shí)和操作地圖時(shí),調(diào)用特定名稱的方法即可。

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

@property (nonatomic,strong) EepMSVGMapDisplayModeState* mapState;
+(instancetype)sharedInstance;
-(void)setMapMode:(EepMSVGMapDisplayMode)mapMode;
//當(dāng)前地圖模式
-(EepMSVGMapDisplayMode)currentMapMode;
//操作地圖
-(void)handleMap;
//點(diǎn)擊了模式切換按鈕
-(void)modeSwitch;
@end

實(shí)現(xiàn)相當(dāng)簡(jiǎn)單,比如對(duì)于操作地圖接口,只需要調(diào)用當(dāng)前狀態(tài)的 handleMapWithContext:方法即可。

-(void)handleMap{
    [self.mapState handleMapWithContext:self];
    [[NSNotificationCenter defaultCenter] lt_postNotificationOnMainThreadName:ALEMapDisplayModeChangeKey object:nil];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,087評(píng)論 4 61
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 接連半月在辦公室以外來(lái)回跑,做一些之前并未接觸過(guò)的事情,這中間有謹(jǐn)言慎行、有各種虐心,有沖突、有被玩弄、有精神崩潰...
    臻靜閱讀 306評(píng)論 8 2
  • 【奇跡30-20班 晚課】精華分享 金錢不過(guò)就是一場(chǎng)頻率游戲 靈修~ 第一階段:持續(xù)清理的過(guò)程 第二階段:形成全新...
    四月天兒0315閱讀 720評(píng)論 0 0

友情鏈接更多精彩內(nèi)容