SideMenu阅读
这个开源项目在我的阅读清单已经躺了很久了,刚才看到才发现,已经于两年前停更了
项目的效果是实现了多样化的侧边滑入菜单,具体可以在G站项目首页看到。
初始化
ViewDidLoad的时候有一步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
- 添加滑动手势识别
视图检查
可以看到在左侧添加了一个Navi
源码检查
触发滑动手势的入口在handleMenuPan(_ gesture: UIPanGestureRecognizer)
,检查发现它是每次通过menu(forLeftSide: leftSide)
取navi,比如左侧就是leftMenuNavigationController
。这个leftMenuNavigationController
是我们在viewDidLoad的时候注册的。
也就是说,这个sideNav是长期持有的,这一点,在对象检查里也可以看到
并且,其持有的VC也一直在内存里,当然,viewDidDisappear肯定是走了的。
UIViewControllerAnimatedTransitioning
要实现这种基于VC的定制化跳转,肯定绕不开UIViewControllerTransitioningDelegate
,在SideMenu里,这个类叫做SideMenuTransitionController
而UIViewControllerAnimatedTransitioning
的实现类叫做SideMenuAnimationController
Print这个写法也很有意思
比如cannotPush
这个case,它利用了Swift支持String Enum的形式,用enum作为错误类型枚举,同时呢,又在里面植入了%@
,在使用的时候,通过Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true)
这样的形式把参数传入,实现一个非常不错的日志效果。
但是有点遗憾的是,这里没有支持参数检查比如我增加了无用参数或者参数类型不对,都不能发出warning,但运行时可能会因为入参类型不匹配发生BAD ACCESS crash
局限
在SideMenu打开时原本页面不能滑动,毕竟它在sideMenuTransitionController(:didPresent:)
里给superVIew添加了一个点击和滑动手势用来关闭SideMenu
但是我把这两个手势注释掉之后,仍然不能滑动,原因在于为了防止手势触发冲突,在弹出时设置了isUserInteractionEnabled=false
,这些注释掉之后,就可以做到弹出时原本页面也可以滑动了
检查发现这个星空背景是UITransitionView的,也挺有意思
点赞
总体来说这个库还是写的很不错的,封装的很棒,支持的效果多,实现的各种效果也很好,算是一个很酷的组件
项目源码