Mutual Mobile Drawer Controller
随着使用抽屉效果的应用越来越多,MMDrawerController应运而生。MMDrawerController是一个仅支持侧边抽屉导航的轻量级库。同时库中还提供了定制展现、收缩抽屉导航栏动画的方法。
Documentation 官方的文档在CocoaDocs中可以找到。
Installing MMDrawerController 你可以使用CocoaPods在你的项目中安装MMDrawerController。
pod 'MMDrawerController', '~> 0.5.7'
Creating a Drawer Controller 创建一个MMDrawerController和创建一个中央视图控制器与抽屉视图控制器一样简单,然后再初始化抽屉。
UIViewController * leftDrawer = [[UIViewController alloc] init];
UIViewController * center = [[UIViewController alloc] init];
UIViewController * rightDrawer = [[UIViewController alloc] init];
MMDrawerController * drawerController = [[MMDrawerController alloc] initWithCenterViewController:center leftDrawerViewController:leftDrawer rightDrawerViewController:rightDrawer];
Features UINavigationController Support MMDrawerController可以无缝接受一个UINavigationController作为中心视图控制器(centerViewController),并且自动更新所支持的手势。总的来说,使用下面描述的分类,任何包含在UINavigationController中的子视图控制器可以访问父视图控制器。(我觉得翻译的有瑕疵,贴出原文: In addition, any child view controller contained within the UINavigationController will have access to the parent drawer controller using the category explained below.)
UIGestureRecongnizer Support MMDrawerController通过两个掩码(一个用于打开,一个用于关闭)支持手势开关抽屉,选项如下:
MMOpenDrawerGestureMode MMOpenDrawerGestureModePanningNavigationBar:用户可以通过拖拽导航条的任何地方来打开抽屉视图
MMOpenDrawerGestureModePanningCenterView:用户可以通过拖拽中央视图的任何地方来打开抽屉视图
MMOpenDrawerGestureModeBezelPanningCenterView:用户可以通过在任意地方开始,离边缘20个点位内拖拽来打开抽屉视图(原文:The user can open the drawer by starting a pan anywhere within 20 points of the bezel)
MMOpenDrawerGestureModeCustom:开发者可以提供一个回调函数(block)来决定手势是否可以被识别。更多信息请接着看。
MMCloseDrawerGestureMode MMCloseDrawerGestureModePanningNavigationBar:用户可以通过拖拽导航条的任意地方来关闭抽屉视图
MMCloseDrawerGestureModePanningCenterView:用户可以通过拖拽中心视图的任意地方来关闭抽屉视图
MMCloseDrawerGestureModeBezelPanningCenterView:用户可以从中央视图的任意地方开始,在边缘之内拖拽来关闭抽屉视图(原文:The user can close the drawer by starting a pan anywhere within the bezel of the center view)
MMCloseDrawerGestureModeTapNavigationBar:用户可以通过点击导航条来关闭抽屉视图
MMCloseDrawerGesturePanningDrawerView:用户可以拖拽抽屉视图任意位置来关闭它
MMCloseDrawerGestureModeCustom:开发者可以提供一个回调函数(block)来决定是否接收手势。更多信息请接着看。
你可以自由的设置任何打开关闭抽屉视图的组合。不过请注意这些手势可能与发送到子视图控制器的点击冲突,所以请在你的应用中适当的使用手势。
例如,如果一个MKMapView是你的中央视图,你可能不希望设置MMOpenDrawerGestureModePanningCenterView,因为那可能让MKMapView拦截这个拖拽,并以为那是在移动地图。
Custom Gesture Recognizer Support 从0.3.0版本开始,你可以使用setGestureShouldRecognizeTouchBlock:方法并提供一个回调函数(block)来决定一个手势是否可以被识别。这个方法提供了三个参数-抽屉视图,手势和点击(the drawer controller, the gesture, and the touch)。作为开发者,你有责任检验这三个参数,并且决定一个手势是否应该被识别。注意,如果你在相应的掩码中设置了MMOpenDrawerGestureModeCustom / MMCloseDrawerGestureModeCustom,回调函数(block)才会有效(原文:Note the block is only consulted if you have set MMOpenDrawerGestureModeCustom/MMCloseDrawerGestureModeCustom on the appropriate mask)。
比如,假设你的中心视图控制器包含一些元素,你只希望当拖拽手势的初始点击处在一个子视图中。你应该确保openDrawerGestureModeMask包含了
注意,你应该不会想让openDrawerGestureModeMask包含MMOpenDrawerGestureModePanningCenterView,因为那样会产生自动无视手势在中心视图中的起始点的效果(原文:since that would take over and be applied automatically regardless of where the touch begins within the center view)。
Custom Drawer Open/Close Animations 当抽屉视图打开或关闭效果被拖拽手势触发时,MMDrawerController提供了一个回调函数供开发者实现自己的动画效果。在回调函数(block)中,你有责任更新抽屉视图的视觉状态,同时,抽屉视图将会处理那个状态的动画。 比如,要在动画过程中设置抽屉视图侧边栏的alpha值时,你可以按照下面的实现方式:
总的来说,MMDrawerController提供了一些过渡动画。这些动画被包含在MMDrawerController项目中的子项目里,详情请看文档(原文:In addition, MMDrawerController ships with several prebuilt animations to let you go crazy right out of the box. These are included as a subspec for the project, and more information can be found below)。
Center View COntroller Interaction Mode 当抽屉视图被打开时,你可以控制用户和中心视图控制器的交互方式。
MMDrawerOpenCenterInteractionModeNone:用户不能与中心视图的任何内容有交互。
MMDrawerOpenCenterInteractionModeFull:用户可以与中心视图的任何内容有交互。
MMDrawerOpenCenterInteractionModeNavigationBarOnly:用户只能与导航条中的内容交互。这个设置允许菜单按钮被响应,允许你在抽屉视图打开的时候让它关闭。上述都是默认设置。
Accessing the Drawer Controller from a Child View Controller 你可以使用UIViewController+MMDrawerController分类在子视图控制器中直接访问drawerController。
State Restoration 从0.4.0版本开始,MMDrawerController支持iOS状态恢复。为了让MMDrawerController使用state restoration选项,你必须为你的抽屉视图设置restorationIdentifier。如果你需要让MMDrawerController管理的三个视图都有恢复功能,你的centerViewController,leftDrawerViewController和rightDrawerViewController的实例必须设置它们自己的restorationIdentifier(创建一个restorationClass也是可以的)。如果你的应用被放在后台运行时MMDrawerController有一个打开的抽屉视图,那么程序切换到前台运行时这个状态也必须被恢复。
iOS 7 Status Bar Support Child View Controller Support 从iOS7开始,默认情况下子视图控制器将决定status bar的状态,包括status bar的风格及它是否被隐藏。这些值将会在抽屉侧边栏状态改变时被更新,这意味着侧边抽屉视图会提供一个与中心视图不同的状态值。
如果你不希望抽屉视图会影响子视图控制器的这些状态,你应该继承MMDrawerController,覆盖childViewControllerForStatusBarStyle和childViewControllerForStatusBarHidden,并让它们都返回nil。
Custom Status Bar Background View 如果你的中心视图控制器和抽屉控制器颜色差异较大,iOS7的status bar的处理方式会让你的应用看起来跟想象的差距较大。从iOS7开始,MMDrawerController支持在屏幕顶部绘制定制的状态栏。为了提供给你一个能展示颜色差异大的状态栏,并且能在状态栏下面能显示你自定义的内容,请在iOS6.x以下版本使用上述设计。 为了使用自定义的status bar,设置showStatusBarBackgroundView为YES即可。默认情况下,这个设置会在status bar下面绘制一个黑色的view,并把你的内容调整的比status bar低一点点。如果你想用自定义的status background color,你可以设置statusBarViewBackgroundColor为任何你想要的颜色。
Subcalssing 如果你计划继承MMDrawerController,在你的继承类中导入MMDrawerController+Sbuclass.h文件,这样你就可以使用MMDrawerController0保护的方法。注意,少部分的方法会假设或者要求你调用super的方法,所以请注意调用super方法。
如果现有方法不足以实现你的需求,请打开Github的issue,告诉我们你的需求,我们会尽力相助。
MMDrawerBarButtonItem 我们用代码绘制了一个标准菜单按钮,你可以在任何UINavigationBar中使用,你也可以为它设置任何你想要的颜色。MMDrawerBarButtonItem包含在这个项目的subspec中,请尽情使用。 从iOS7开始,抽屉按钮被绘制的更细了。总的来说,设置颜色的方法不同了,颜色主要被tintColor决定。同时请注意,阴影也会随系统主题而不同。
Prebuilt Example Animations 为了你能更方便的使用MMDrawerController,我们提供了常用的动画效果。你只需要导入MMDrawerVisualStates子项目,便可以使用我们提供的视觉效果。 比如你需要使用滑动和缩放动画,你可以这样:
[drawerController setDrawerVisualStateBlock:[MMDrawerVisualState slideAndScaleVisualStateBlock]];
下面是我们的动画列表:
Slide:抽屉与中心视图滑动的速率相同。
Slide and Scale:抽屉在滑动的同时会进行缩放,并且alpha(透明度)值也会从0.0增长到1.0。
Swinging Door:抽屉会在中心视图和边缘之间晃动(字面意思看感觉像是果冻效果,原文:The drawer swings in along a hinge on the center view controller)。
Parallax:抽屉会以一个比中心视图频率低的频率晃动,并有一个视差效果(原文:The drawer slides in at a slower rate than the center view controller, giving a parallax effect)。
Stretchy(弹性) Drawer 默认情况下,当你把侧边抽屉拖到比它宽度还宽的位置时松手,会有一个果冻效果让侧边抽屉恢复到设置的宽度。你可以设置shouldStrethDrawer为NO来关闭这个效果,或者你也可以自定义在percentVisible大于1.0时的动画(原文:or you can make your own overshoot animation by creating a custom visual state block and setting up custom transforms for when percentVisible is greater than 1.0)。
Bounce Preview 为了使你的抽屉侧栏更容易被发现,你可以在应用首次加载时晃动一下抽屉侧栏。你可以用bouncePreviewForDrawerSide:completion: 方法来实现这个效果。 如果你需要自定义抽屉侧栏晃动的距离,你可以使用bouncePreviewForDrawerSide:distance:completion:方法
其他参考资料(Demo):
1.MMDrawerController搭配storyboard使用详解