MMDrawerController
是一个侧边抽屉导航容器视图控制器,旨在支持那些越来越多地采用侧边抽屉范例的应用程序。该库旨在以轻量、专注的方式专门支持侧边抽屉导航,并暴露自定义动画以打开和关闭抽屉的能力。
官方的 appledoc 文档可以在 CocoaDocs 找到。
您可以使用 CocoaPods 在项目中安装 MMDrawerController。
pod 'MMDrawerController', '~> 0.5.7'
创建一个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];
MMDrawerController
无缝接受一个UINavigationController
作为centerViewController
,并将自动更新所有手势支持。此外,任何包含在UINavigationController
内的子视图控制器都将能够通过下面的分类使用父抽屉控制器。
MMDrawerController
通过两种掩码公开了打开和关闭抽屉的手势支持,一个用于打开,一个用于关闭。选项如下所示
MMOpenDrawerGestureMode
MMCloseDrawerGestureMode
您可以根据需要自由设置打开和关闭的组合。请注意,这些手势可能会影响发送给子视控器的触摸事件,因此请确保为您的应用程序适当的设置。例如,如果您的中心视图控制器是MKMapView,那么您不希望设置MMOpenDrawerGestureModePanningCenterView
,因为它会拦截地图移动的滑动意图。
从版本0.3.0开始,您现在可以使用setGestureShouldRecognizeTouchBlock:
方法提供一个回调块来确定是否识别手势。此方法提供了三个参数 - 抽屉控制器、手势和触摸。作为开发者,您负责检查这些元素并确定是否识别手势。注意,只有当您已在适当的面具上设置了MMOpenDrawerGestureModeCustom
/MMCloseDrawerGestureModeCustom
时,才会咨询此块。
例如,假设您有一个中心视图控制器,其中包含一些元素,并且您只想在触摸开始时在某个子视图中识别滑动手势来打开抽屉。您需要确保openDrawerGestureModeMask
包含MMOpenDrawerGestureModeCustom
,并且可以设置以下块
[myDrawerController
setGestureShouldRecognizeTouchBlock:^BOOL(MMDrawerController *drawerController, UIGestureRecognizer *gesture, UITouch *touch) {
BOOL shouldRecognizeTouch = NO;
if(drawerController.openSide == MMDrawerSideNone &&
[gesture isKindOfClass:[UIPanGestureRecognizer class]]){
UIView * customView = [drawerController.centerViewController myCustomSubview];
CGPoint location = [touch locationInView:customView];
shouldRecognizeTouch = (CGRectContainsPoint(customView.bounds, location));
}
return shouldRecognizeTouch;
}];
请注意,您不希望openDrawerGestureModeMask
包含MMOpenDrawerGestureModePanningCenterView
,因为这会覆盖并自动应用,无论触摸在中心视图的哪个位置开始。
MMDrawerController
提供了一个回调块,允许您在打开/关闭或滑动手势事件发生时为抽屉控制器实现自定义状态。在块内,您负责更新抽屉控制器的视觉状态,抽屉控制器将处理动画到该状态。
例如,为了在动画期间将侧抽屉控制器的alpha值从0设置为1,您将执行以下操作
[drawerController
setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {
UIViewController * sideDrawerViewController;
if(drawerSide == MMDrawerSideLeft){
sideDrawerViewController = drawerController.leftDrawerViewController;
}
else if(drawerSide == MMDrawerSideRight){
sideDrawerViewController = drawerController.rightDrawerViewController;
}
[sideDrawerViewController.view setAlpha:percentVisible];
}];
此外,MMDrawerController
还提供了一些预构建的动画,让您可以立即开始使用。这些作为项目的一个子规格包含在内,有关更多信息可以在下文中找到。
当抽屉打开时,您可以控制用户如何与中心视图控制器交互。
您可以使用UIViewController+MMDrawerController
分类,以便从子视图控制器中直接查询drawerController。
从0.4.0版本开始,MMDrawerController
支持iOS状态恢复。为了使MMDrawerController
能够启用状态恢复,您必须设置drawer控制器的restorationIdentifier
。如果您的centerViewController
、leftDrawerViewController
和rightDrawerViewController
实例需要恢复,还必须为它们配置自己的restorationIdentifier
(以及可选的restorationClass)。如果您的MMDrawerController在您的应用被发送到后台时有一个打开的抽屉,该状态也将被恢复。
从iOS 7开始,子视图控制器将默认确定状态栏的状态,包括其风格以及是否隐藏。这意味着当打开侧边栏状态改变时,该值也会更新,这意味着一个侧边栏可以提供一个与中心视图控制器不同的值。
如果您不希望抽屉控制器咨询子视图控制器以确定此状态,您应子类化MMDrawerController
,覆盖childViewControllerForStatusBarStyle
和childViewControllerForStatusBarHidden
,并返回nil。
如果您中心视图控制器和抽屉控制器之间存在对比度颜色,新iOS 7状态栏处理可能导致您的应用程序看起来不那么理想。从iOS 7开始,MMDrawerController
支持在屏幕上方绘制一个自定义状态栏区域,以提供用于显示具有恒定颜色的状态栏的区域,同时在状态栏下方绘制自定义内容时不必担心导航栏的颜色或内容顶部是否侵入了状态栏之下。使用此功能基本上模仿了<= iOS 6.X的行为。
要启用自定义状态栏,简单地将showsStatusBarBackgroundView
设置为YES
。默认情况下,这将绘制一个黑色视图在状态栏下方,并将您的布局内容调整到状态栏以下。如果您需要自定义状态栏背景颜色,请将statusBarViewBackgroundColor
设置为所需的颜色。
如果您计划子类化MMDrawerController
,将MMDrawerController+Subclass.h
导入到您的子类中,以便访问MMDrawerController
的受保护方法。请注意,一些方法假定并且要求您调用super,因此请确保遵循此约定。
如果有特定的功能您需要,但这些方法不支持,请在一个GitHub问题上说明您的需求,我们可以尝试打开可以帮助您的方法。
一些易于使用的小功能...
使用Paint Code,我们创建了一个标准菜单按钮,您可以在任何UINavigationBar
中使用,并使其变成您想要的颜色。它作为库的子规范包含在内。祝您使用愉快。
从iOS 7开始,抽屉按钮现在以更细的线条绘制。此外,颜色方法已被弃用,颜色现在将由tintColor。
确定。请注意,阴影也已弃用,以便与操作系统的设计主题更一致。
为了使您尽可能容易地使用此库,我们创建了今天我们所看到的常见动画。只需包含MMDrawerVisualStates
子规范,并使用任何预建视图状态。
例如,如果您想使用滑动和缩放动画,您可以这样做:
[drawerController setDrawerVisualStateBlock:[MMDrawerVisualState slideAndScaleVisualStateBlock]];
就是这样...
以下是一些内置动画的快速列表
默认情况下,侧抽屉将拉伸以超出最大抽屉宽度,从而产生一种有趣的风景区。您可以通过将shouldStretchDrawer
设置为NO来禁用此功能,或者您可以通过创建自定义视图状态块并设置当percentVisible大于1.0时自定义转换来创建自己的超射动画。
为了让您的侧抽屉更易于发现,在用户首次启动应用时弹出抽屉可能很有帮助。您可以使用bouncePreviewForDrawerSide:completion:
方法轻松完成此操作。
如果您想弹跳自定义距离,请使用bouncePreviewForDrawerSide:distance:completion:
。
我们决定使用从PaintCode生成的图形对示例进行一些美化。希望您喜欢它。
此示例展示了库的所有功能。试一试。
为了保持库的轻量级,我们做出了某些设计权衡决策。具体来说,我们决定此库将不执行以下操作
UINavigationController
以外的容器视图控制器(如UITabBarController
或UISplitViewController
)作为中心视图控制器。我们相信这个列表会随着时间的推移而增长。但是,这是保持项目可维护性的代价 :)
在编辑时最佳的设置方法是,将打开/关闭遮挡掩码设置为MMOpenDrawerGestureModeNone
/ MMCloseDrawerGestureModeNone
,并在编辑完成后恢复遮挡掩码。这会使适当的正确手势/触摸传递到表格视图。(#184)
由以下这批优秀的专家设计和开发:Mutual Mobile
我们非常乐意听取对这个库的反馈。请创建Github问题,或者在Twitter上联系我们。
MMDrawerController
在MIT许可证下可用。更多信息请参阅LICENSE文件。