JVFloatingDrawer 是一个浮动式抽屉导航。越来越多的应用正在利用抽屉模式。大多数应用看起来都很相似。使用 JVFloatingDrawer,我们致力于为常规设置带来新的外观。
JVFloatingDrawer 非常容易使用。下面是开始所需的一切。
JVFloatingDrawerViewController *drawerViewController = [[JVFloatingDrawerViewController alloc] init];
// Assign to your own view controllers
drawerViewController.leftViewController = leftDrawerViewController;
drawerViewController.rightViewController = rightDrawerViewController;
drawerViewController.centerViewController = centerViewController;
self.drawerViewController.backgroundImage = [UIImage imageNamed:@"background-image-example.jpg"];
drawerViewController.animator = [[JVFloatingDrawerSpringAnimator alloc] init];
要查看此实现的示例,请运行示例项目。克隆库,从 Example 目录中运行 pod install
,并打开 Example/JVFloatingDrawer.xcworkspace
。
JVFloatingDrawer 被分割成几个可扩展的组件,它们之间相互通信。
JVFloatingDrawerViewController
JVFloatingDrawerViewController
保留了对中心、左侧和/或右侧 UIViewController
对象的引用。可以通过简单地将它重新分配给不同的视图控制器来替换 centerViewController
。同样针对 leftViewController
和 rightViewController
。
JVFloatingDrawerViewController
是您打开、关闭和切换侧边抽屉的地方。
- (void)openDrawerWithSide:(JVFloatingDrawerSide)drawerSide animated:(BOOL)animated
completion:(void(^)(BOOL finished))completion;
- (void)closeDrawerWithSide:(JVFloatingDrawerSide)drawerSide animated:(BOOL)animated
completion:(void(^)(BOOL finished))completion;
- (void)toggleDrawerWithSide:(JVFloatingDrawerSide)drawerSide animated:(BOOL)animated
completion:(void(^)(BOOL finished))completion;
您还可以通过设置这些属性来自定义 leftDrawerWidth
和 rightDrawerWidth
。
通过将 backgroundImage
属性赋值来设置背景图片。
动画器是 JVFloatingDrawer
的主要演员。《JVFloatingDrawer》自带一个预设的弹簧动画器,可以通过设置其 animationDuration
、animationDelay
、springDamping
和 initialSpringVelocity
进行自定义。在实例化一个新的动画器对象后,将其分配给 JVFloatingDrawerViewController
上的 animator
属性,以让它发挥作用。您可以通过实现 JVFloatingDrawerAnimation
协议来制作自己的动画器。稍后会更详细地介绍。
JVFloatingDrawerView
JVFloatingDrawerView
是一个内部类,用户不需要与之交互。它的任务是使用自动布局约束来布局侧滑抽屉。它处理了中心视图控制器周围的装饰项,如阴影和圆角。JVFloatingDrawerViewController
中的每个视图控制器(中心、左侧和右侧)都被封装在 UIView
容器中。这是我们支持抽屉交换的方式。
JVFloatingDrawerSpringAnimator
类是您可以使用的特色动画器。如果您想创建自己的动画器,也很简单。所有动画器都遵守 JVFloatingDrawerAnimation
协议。 JVFloatingDrawerAnimation
有两个 必需 的方法 presentation 和 dismissal
- (void)presentationWithSide:(JVFloatingDrawerSide)drawerSide sideView:(UIView *)sideView centerView:(UIView *)centerView animated:(BOOL)animated completion:(void(^)(BOOL finished))completion
给定一个抽屉侧边、包含的侧视图和包含的中心视图,实现必须将侧视图显示在屏幕上。如果 drawerSide
等于 JVFloatingDrawerSideLeft
,则视图将位于 centerView
的左侧。如果 drawerSide
等于 JVFloatingDrawerSideRight
,则视图将位于 centerView
的右侧。您可以完全控制如何完成此操作。我在我的实现中使用视图转换,并调用了 UIView
的 -animateWithDuration:delay:usingSpringWithDamping:...
。从技术上讲,您甚至不需要使抽屉浮动。如果您喜欢,可以复制传统的抽屉滑动样式。最后,实现必须根据用户是否希望执行此动画来相应地作出反应,然后调用末尾的 completion
块。
- (void)dismissWithSide:(JVFloatingDrawerSide)drawerSide sideView:(UIView *)sideView centerView:(UIView *)centerView animated:(BOOL)animated completion:(void(^)(BOOL finished))completion
消失与显示完全相同,除此之外,它需要能够获取打开的抽屉的当前位置并将它移出屏幕。同样,您如何实现这一点取决于您。
- (void)willRotateOpenDrawerWithOpenSide:(JVFloatingDrawerSide)drawerSide sideView:(UIView *)sideView centerView:(UIView *)centerView
- (void)didRotateOpenDrawerWithOpenSide:(JVFloatingDrawerSide)drawerSide sideView:(UIView *)sideView centerView:(UIView *)centerView
-willRotateOpenDrawerWithOpenSide:sideView:centerView
在设备方向改变前立即调用,以便动画器可以处理它。 -didRotateOpenDrawerWithOpenSide:sideView:centerView
在之后立即调用。 JVFloatingDrawerSpringAnimator
仅实现了 -didRotateOpenDrawerWithOpenSide:sideView:centerView
并在其中调用了与 -presentationWithSide:sideView:centerView:animated:completion:
相同的代码。
Julian Villella
JVFloatingDrawer 采用 MIT 许可证发布。有关更多信息,请参阅 LICENSE 文件。