SideMenu閱讀
這個(gè)開源項(xiàng)目在我的閱讀清單已經(jīng)躺了很久了,剛才看到才發(fā)現(xiàn)隔显,已經(jīng)于兩年前停更了
項(xiàng)目的效果是實(shí)現(xiàn)了多樣化的側(cè)邊滑入菜單运敢,具體可以在G站項(xiàng)目首頁看到邑遏。
初始化
ViewDidLoad的時(shí)候有一步setupSideMenu
:
private func setupSideMenu() {
// Define the menus
SideMenuManager.default.leftMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "LeftMenuNavigationController") as? SideMenuNavigationController
SideMenuManager.default.rightMenuNavigationController = storyboard?.instantiateViewController(withIdentifier: "RightMenuNavigationController") as? SideMenuNavigationController
// Enable gestures. The left and/or right menus must be set up above for these to work.
// Note that these continue to work on the Navigation Controller independent of the View Controller it displays!
SideMenuManager.default.addPanGestureToPresent(toView: navigationController!.navigationBar)
SideMenuManager.default.addScreenEdgePanGesturesToPresent(toView: view)
}
總的來說兩件事:
- 添加左右MenuNavi
- 添加滑動(dòng)手勢識(shí)別
視圖檢查
可以看到在左側(cè)添加了一個(gè)Navi
源碼檢查
觸發(fā)滑動(dòng)手勢的入口在handleMenuPan(_ gesture: UIPanGestureRecognizer)
,檢查發(fā)現(xiàn)它是每次通過menu(forLeftSide: leftSide)
取navi困曙,比如左側(cè)就是leftMenuNavigationController
表伦。這個(gè)leftMenuNavigationController
是我們?cè)趘iewDidLoad的時(shí)候注冊(cè)的谦去。
也就是說,這個(gè)sideNav是長期持有的蹦哼,這一點(diǎn)鳄哭,在對(duì)象檢查里也可以看到
并且,其持有的VC也一直在內(nèi)存里纲熏,當(dāng)然妆丘,viewDidDisappear肯定是走了的。
UIViewControllerAnimatedTransitioning
要實(shí)現(xiàn)這種基于VC的定制化跳轉(zhuǎn)赤套,肯定繞不開UIViewControllerTransitioningDelegate
飘痛,在SideMenu里,這個(gè)類叫做SideMenuTransitionController
而UIViewControllerAnimatedTransitioning
的實(shí)現(xiàn)類叫做SideMenuAnimationController
Print這個(gè)寫法也很有意思
比如cannotPush
這個(gè)case容握,它利用了Swift支持String Enum的形式宣脉,用enum作為錯(cuò)誤類型枚舉,同時(shí)呢剔氏,又在里面植入了%@
塑猖,在使用的時(shí)候,通過Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
這樣的形式把參數(shù)傳入谈跛,實(shí)現(xiàn)一個(gè)非常不錯(cuò)的日志效果羊苟。
但是有點(diǎn)遺憾的是,這里沒有支持參數(shù)檢查比如我增加了無用參數(shù)或者參數(shù)類型不對(duì)感憾,都不能發(fā)出warning蜡励,但運(yùn)行時(shí)可能會(huì)因?yàn)槿雲(yún)㈩愋筒黄ヅ浒l(fā)生BAD ACCESS crash
局限
在SideMenu打開時(shí)原本頁面不能滑動(dòng),畢竟它在sideMenuTransitionController(:didPresent:)
里給superVIew添加了一個(gè)點(diǎn)擊和滑動(dòng)手勢用來關(guān)閉SideMenu
但是我把這兩個(gè)手勢注釋掉之后阻桅,仍然不能滑動(dòng)凉倚,原因在于為了防止手勢觸發(fā)沖突,在彈出時(shí)設(shè)置了isUserInteractionEnabled=false
嫂沉,這些注釋掉之后稽寒,就可以做到彈出時(shí)原本頁面也可以滑動(dòng)了
檢查發(fā)現(xiàn)這個(gè)星空背景是UITransitionView的,也挺有意思
點(diǎn)贊
總體來說這個(gè)庫還是寫的很不錯(cuò)的,封裝的很棒趟章,支持的效果多杏糙,實(shí)現(xiàn)的各種效果也很好,算是一個(gè)很酷的組件
項(xiàng)目源碼