WKViewManager iOS 弹窗架构
前言
近來由于App中彈窗過多,再加上還有半透明的引導層,時常會出現多個彈窗重疊彈出,甚至會伴隨引導層一起彈出,極大的影響了用戶體驗。
上述問題,其實很簡單,只需要添加一個彈窗隊列即可。
但是與此同時我們又添加了新的需求如下:
由于項目中我們采用了模塊化的方式精簡代碼、降低工作耦合,所以我們的彈窗并不是基于ViewController彈出的,而是在需要彈出的時候獲取當前顯示的ViewController用于顯示的。
例如項目中任務模塊,任務是可以在任何地方任何時候被完成,任務本身不關心它是位于何時何地被完成,只需要關心完成后,需要對應做出什么操作,例如寫本地數據庫,更新用戶數據,彈出完成任務提示,和ViewController并無大的關聯。
簡單的說,我們的彈窗是屬于功能塊的,而功能塊不應該且不用去關心當前展示的ViewController是哪一個。功能介紹
本文介紹的一個彈窗架構實際也可以歸類為一個彈窗功能模塊,當彈窗出現在不該出現的地方時,它來負責調度和處理,其過程對于其它功能模塊透明,并不產生任何耦合度。其實現功能如下:
優點
WKViewManager 彈窗隊列管理類,使用AOP切片基于self-manager模式封裝,高內聚性,幾乎不會和ViewController或功能模塊產生耦合。
劣勢
由于是彈窗視圖的一個管理工具,所有需要被管理的彈窗均需屬于WKBaseView的子類,項目中已書寫對應所需要的彈窗基類如WKPopBaseView、WKStepMaskGuideView等等,有需要構建彈窗的時候可以去查看相關類。
(關于WKBaseView,是一個封裝的非常完善的彈窗基類,預計后續會寫一篇文章詳細介紹,它的整個結構是非常完善,針對彈窗功能幾乎沒有擴充瓶頸)實現原理
白名單模式(功能點4)
白名單模式只有一個關鍵內容
白名單字典 - whiteList白名單字典位于WKViewManager類中。
字典中key為從屬于WKBaseView的子類的類名字符串,value是一個數組,里面放入對應的ViewController的類名字符串。
例如 白名單內容為
@{@"KMAnnouncementView":@[@"HJTMainTabBarVC"]};則在廣告公告模塊中,KMAnnouncementView調用顯示時,所獲取的View不是HJTMainTabBarVC的View,則KMAnnouncementView會進入白名單待顯示數組中,當HJTMainTabBarVC調用viewwillappear時才會實際被顯示出來。
一句話介紹白名單
白名單中的key對應的view永遠只會出現在其對應的value中的vc上,即便你在其他任何VC上調用顯示顯示KMAnnouncementView, KMAnnouncementView也只會出現在其對應的value的vc上。黑名單模式(功能點5)
黑名單模式包括兩個關鍵內容。
黑名單字典 - blackList黑名單HomeVC - blackListHomeVCClassName黑名單字典位于WKViewManager類中。
字典中key為ViewController的類名字符串,value是一個數組,里面應放入對應的從屬于WKBaseView的子類的類名字符串。
例如 黑名單內容為
@{@"KMBaseViewController",@[@"WKPopBaseView"]};則表明,WKPopBaseView類(不包含其子類),如果由于功能塊解耦或者其它原因,導致WKPopBaseView被展示于KMBaseViewController(不包含其子類)的子視圖上時,WKViewManager會攔截此行為,將WKPopBaseView實例存入黑名單待顯示數組,當回到黑名單HomeVC時再顯示出來。從而實現了WKPopBaseView一定不會出現在KMBaseViewController的視圖上。
一句話解釋黑名單
黑名單中key對應的vc顯示時,其對應的value中的view必然不會出現,如果被強制出現時,其也不會出現,直到黑名單homeVC的viewwillappear被調用才會顯示。功能點6
由于隊列基于viewcontroller的,所以很簡單只需要hook viewcontroller的 willappear和diddisappear即可,在willappear里面找到隊列設置suspended為NO,在diddisappear里面suspended為yes即可
Demo地址
使用方式
前提:因為內部實現使用了Masonry布局,所以需要先Pod Masonry三方庫。
步驟一、
下載Demo,找到BaseView文件夾拖入項目。步驟二、
將文件中的WKViewManagerHeader.h文件加入全局頭文件.pch中。步驟三、
新建的View繼承自WKPopBaseView,并重寫setInterFace,需首先調用父類的實現 - (void)setInterFace {[super setInterFace];//TODO contentview的高度必須設置[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.equalTo(self);make.centerY.equalTo(self).offset(SCREEN_HEIGHT);make.width.height.equalTo(@200);}]; } 可自定義出現和消失動畫--------實現updateContentViewConstraint:(BOOL)isShow方法 - (void)updateContentViewConstraint:(BOOL)isShow {[self.contentView mas_updateConstraints:^(MASConstraintMaker *make) {make.centerY.equalTo(self).offset(isShow ? 0 : SCREEN_HEIGHT);}]; } 還有更多可自定義的效果,可通過頂層基類WKbaseVIew封裝的聲明周期實現。詳情請查看Demo步驟四、
初始化后,在需要展示的地方調用showInView:isShow:方法即可。 WKTestView * v = [[WKTestView alloc] init];v.title = @"This is Test View can not show in HomePage";[v showInView:self.view isShow:YES];交流方式
郵箱357863248@qq.com
總結
以上是生活随笔為你收集整理的WKViewManager iOS 弹窗架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优惠幅度超万元?比亚迪回应启动降价:并非
- 下一篇: Spark2.4.0 SparkEnv