MSDynamicsDrawerViewController 1.5.1

MSDynamicsDrawerViewController 1.5.1

测试已测试
语言语言 Obj-CObjective C
授权 MIT
发布最后发布2014年12月

Eric HoracekEric Horacek 维护。



  • 作者
  • Eric Horacek

介绍

MSDynamicsDrawerViewControllerEric HoracekMonospace Ltd. 编写。

是什么?

MSDynamicsDrawerViewController 是一个容器视图控制器,用于管理单个 "面板" 视图控制器和一层或两层 "抽屉" 视图控制器。抽屉视图控制器默认隐藏,但用户可以通过在抽屉视图控制器隐藏的方向的水平滑动来将其曝光。它使用 UIKit Dynamics 进行所有动画——项目中没有使用 animateWithDuration:animations: 的任何调用。

UIKit Dynamics?

MSDynamicsDrawerViewController 集成了 Apple 的 UIKit Dynamics API(iOS7 中引入),为经典的抽屉导航范式提供了新的真实感。虽然下面的 .gifs 可以在这方面做得很好,但最好还是克隆、构建并在设备上运行示例项目来感受其性能。

那么我能用它做什么?

投掷

打开和关闭

弹射

替换

安装

将以下内容添加到您的 Podfile 中并运行 $ pod install

pod 'MSDynamicsDrawerViewController'

如果您还没有安装或整合 CocoaPods 到项目中,您可以在此学习如何做到这一点 链接

文档

CocoaDocs

MSDynamicsDrawerViewController 的文档可通过 CocoaDocs 在线获取。

Xcode

如果您要安装 MSDynamicsDrawerViewController 的文档到 Xcode,您首先需要安装 Appledoc$ brew install appledoc),然后在仓库根目录下的 MSDynamicsDrawerViewController.xcodeproj 中运行 Documentation 实例。

示例

Example.xcworkspace 目录中的代码是 MSDynamicsDrawerViewController 的一个示例实现。它使用 Cocoapods 将根目录下的 MSDynamicsDrawerViewController 源文件链接作为开发依赖。因此,请使用示例 xcworkspace,而不是 xcproj

使用方法

面板视图控制器

面板视图控制器是主要视图控制器, centered 并覆盖在抽屉视图控制器上方。用户可以在面板视图控制器上的任何位置滑动以露出下方的抽屉视图控制器。

通过 paneViewController 属性可以将 UIViewController 实例添加为面板视图控制器

UIViewController *paneViewController = [UIViewController new];
dynamicsDrawerViewController.paneViewController = paneViewController;

替换面板视图控制器

可以通过滑动面板到侧边并替换为一个新的面板,然后滑动新面板关闭来替换面板视图控制器。请参见上方的 "Replace" .gif 来查看此动画。您可以使用 setPaneViewController:animated:completion: 方法来启动这个动画。

UIViewController *paneViewController = [UIViewController new];
[dynamicsDrawerViewController setPaneViewController:paneViewController animated:YES completion^{
    // Successfully set the pane view controller
}];

如果您不希望该动画中的 "滑动离开" 部分,请将您的 MSDynamicsDrawerViewController 实例上的 paneViewSlideOffAnimationEnabled 属性值设置为 NO

抽屉视图控制器

抽屉视图控制器作为面板视图控制器下方的抽屉显示。可以为任何四个基本方向(上、左、下、右)设置抽屉视图控制器。使用 MSDynamicsDrawerDirection 类型定义将这些方向传达给 MSDynamicsDrawerViewController 的实例。

可以通过 setDrawerViewController:forDirection: 方法将 UIViewController 实例添加为抽屉视图控制器

UIViewController *drawerViewController = [UIViewController new];
[dynamicsDrawerViewController setDrawerViewController:drawerViewController forDirection:MSDynamicsDrawerDirectionLeft];

在添加两个同时存在的抽屉视图控制器时,它们必须位于相反方向(左右或上下)。

替换或删除抽屉

要替换或删除抽屉视图控制器,只需使用上述方法设置新的 UIViewController 实例或 nil 以指定所需的方向。

打开和关闭抽屉

修改 paneState 属性的各种方法用于更改抽屉的 "打开" 状态。

非动画

如果您只需打开或关闭抽屉而不需要动画,并且只有一个抽屉视图控制器,请使用 paneState 属性。

dynamicsDrawerViewController.paneState = MSDynamicsDrawerPaneStateOpen;

如果您有多个抽屉视图控制器,请参阅下方的 多个抽屉视图控制器 部分。

动画

如果您想对抽屉的可见性进行动画效果改变,请使用 setPaneState:animated:allowUserInterruption:completion: 方法。就像 paneState 属性一样,此方法也要求您只添加了一个抽屉视图控制器。

[dynamicsDrawerViewController setPaneState:MSDynamicsDrawerPaneStateOpen animated:YES allowUserInterruption:YES completion:^{
  // Pane has come to rest
}];

调用此方法时需要考虑的一个重要参数是 allowUserInterruption。如果设置为 NO,用户将能够执行“捕获”滑动面板的手势,中断过渡并可能导致最终 paneState 的值与为 paneState 参数传递的值不同。因此,当面板状态发生变化时,不一定调用完成块——只有在它静止时才调用。如果您需要将面板状态更新到指定的状态而不被打断,则必须为此参数传递 YES

如果您有多个抽屉视图控制器,请参阅下方的 多个抽屉视图控制器 部分。

关于多个抽屉视图控制器

如果您在 MSDynamicsDrawerViewController 实例中添加了多个抽屉视图控制器,应该使用上述方法的“方向”等效方法。

  • 非动画 setPaneState:inDirection:
  • 动画 setPaneState:inDirection:animated:allowUserInterruption:completion:

使面板弹跳打开

可以通过调用 bouncePaneOpen 方法使面板弹跳打开。如果您有多个抽屉视图控制器,请使用 bouncePaneOpenInDirection: 方法并指定一个方向。请参见上面“弹跳”.gif的示例。

弹跳是一个很好的方式来表明面板视图控制器下方存在一个可以通过滑动访问的抽屉视图控制器,类似于iOS锁屏相机弹跳。

样式器

MSDynamicsDrawerViewController 使用“样式器”对象的实例来创建相对于抽屉打开/关闭的分数更新的子视图控制器的独特样式。这些样式器遵守 MSDynamicsDrawerStyler 协议。样式器可以通过设置多个样式器(假设它们没有覆盖相同的属性)来组合(对于单个 MSDynamicsDrawerDirection)。

可以通过 addStyler:forDirection: 方法将 MSDynamicsDrawerStyler 的实例添加到 MSDynamicsDrawerViewController,并通过 styler 类方法来实例化。

id <MSDynamicsDrawerStyler> parallaxStyler = [MSDynamicsDrawerParallaxStyler styler]
[dynamicsDrawerViewController addStyler:parallaxStyler forDirection:(MSDynamicsDrawerDirectionLeft | MSDynamicsDrawerDirectionRight)];

默认样式器类

MSDynamicsDrawerViewController 中包含了几个默认样式器。示例项目中的“样式器”菜单选项允许您尝试这些样式器,或者组合使用。

  • 倾斜样式器 MSDynamicsDrawerParallaxStyler 当调整 paneView 的框架时,在 drawerView 上创建一个倾斜效果。通过修改 parallaxOffsetFraction 属性来改变发生的倾斜量。

  • 渐隐样式器 MSDynamicsDrawerFadeStyler 当调整 paneView 的框架时,渐隐 drawerView。通过修改 closedAlpha 属性来改变当关闭 paneView 时发生的渐隐量。

  • 缩放样式器 MSDynamicsDrawerScaleStyler 当调整 paneView 的框架时,在 drawerView 上创建一个缩放效果。通过修改 closedScale 属性来改变当关闭 paneView 时发生的缩放量。

  • 抽屉调整大小样式器 MSDynamicsDrawerResizeStyler 根据从 currentRevealWidth 属性导出的打开抽屉的可见空间调整抽屉视图控制器视图的大小。通过修改 minimumResizeRevealWidth 属性来改变调整大小开始的阈值。

创建自定义样式器

当用户与MSDynamicsDrawerViewController交互时,通过dynamicsDrawerViewController:didUpdatePaneClosedFraction:forDrawerDirection:方法,将消息发送给与活动抽屉方向关联的样式类。此方法允许样式类根据paneClosedFraction更改drawerViewpaneView等元素的属性。

建议自定义样式类不要更改MSDynamicsDrawerViewController实例中paneViewdrawerViewframe属性。这些属性既由用户的触摸操作,也由MSDynamicsDrawerViewController内的内部UIKit Dynamics进行修改。当外部修改帧时,MSDynamicsDrawerViewController的行为是未定义的。

需求

需要iOS 7.0,ARC,以及QuartzCore框架。

贡献

欢迎提交分支、补丁和其他反馈。

许可

Copyright (c) 2012-2013 Monospace Ltd. All rights reserved.

This code is distributed under the terms and conditions of the MIT license.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.