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

点赞

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,562评论 1 14
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,347评论 0 7
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    Jt_Self阅读 775评论 0 4
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    small_Sun阅读 460评论 0 4
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,736评论 1 180