日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WKViewManager iOS 弹窗架构

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WKViewManager iOS 弹窗架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

近來由于App中彈窗過多,再加上還有半透明的引導層,時常會出現多個彈窗重疊彈出,甚至會伴隨引導層一起彈出,極大的影響了用戶體驗。

上述問題,其實很簡單,只需要添加一個彈窗隊列即可。

但是與此同時我們又添加了新的需求如下:

  • 廣告彈窗不能出現在閱讀頁
  • 訂閱更新彈窗只能出現在首頁
  • 版本更新功能提示頁不允許出現任何彈窗
  • 重新安裝后出現的選擇性別和分類的彈窗不允許出現任何彈窗
  • 廣告觀賞頁面不能出現任何彈窗
  • 由于廣告和公告頁面的彈出順序不定,當彈出廣告時,廣告視圖可點擊產生跳轉,但是在跳轉后公告會彈出(公告具備倒計時只顯示多少秒,然后自動消失),則會出現公告無法被用戶看到的情況,則需要在跳轉離開頁面時,暫停隊列
  • 由于項目中我們采用了模塊化的方式精簡代碼、降低工作耦合,所以我們的彈窗并不是基于ViewController彈出的,而是在需要彈出的時候獲取當前顯示的ViewController用于顯示的。

    例如項目中任務模塊,任務是可以在任何地方任何時候被完成,任務本身不關心它是位于何時何地被完成,只需要關心完成后,需要對應做出什么操作,例如寫本地數據庫,更新用戶數據,彈出完成任務提示,和ViewController并無大的關聯。

    簡單的說,我們的彈窗是屬于功能塊的,而功能塊不應該且不用去關心當前展示的ViewController是哪一個。

    功能介紹

    本文介紹的一個彈窗架構實際也可以歸類為一個彈窗功能模塊,當彈窗出現在不該出現的地方時,它來負責調度和處理,其過程對于其它功能模塊透明,并不產生任何耦合度。其實現功能如下:

  • 彈窗視圖按隊列依次出現
  • 彈窗視圖支持優先級模式
  • 隊列基于ViewController,杜絕一個彈窗問題導致全局彈窗失效
  • 彈窗視圖可指定出現于某ViewController出現后(白名單)
  • ViewController可指定不接收彈窗視圖出現于自身出現時(黑名單)
  • 實現ViewController didDisAppear后 隊列暫停,willAppear隊列繼續
  • 優點

    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 弹窗架构的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。