#SideMenu阅读

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


image.png

源码检查

触发滑动手势的入口在handleMenuPan(_ gesture: UIPanGestureRecognizer),检查发现它是每次通过menu(forLeftSide: leftSide)取navi,比如左侧就是leftMenuNavigationController。这个leftMenuNavigationController是我们在viewDidLoad的时候注册的。

也就是说,这个sideNav是长期持有的,这一点,在对象检查里也可以看到


image.png

并且,其持有的VC也一直在内存里,当然,viewDidDisappear肯定是走了的。

UIViewControllerAnimatedTransitioning

要实现这种基于VC的定制化跳转,肯定绕不开UIViewControllerTransitioningDelegate,在SideMenu里,这个类叫做SideMenuTransitionController

UIViewControllerAnimatedTransitioning的实现类叫做SideMenuAnimationController

Print

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的,也挺有意思

点赞

总体来说这个库还是写的很不错的,封装的很棒,支持的效果多,实现的各种效果也很好,算是一个很酷的组件
项目源码

你可能感兴趣的:(#SideMenu阅读)