测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
授权 | MIT |
发布最后发布 | 2014年12月 |
由 Eric Horacek,Eric Horacek 维护。
MSDynamicsDrawerViewController 由 Eric Horacek 为 Monospace Ltd. 编写。
MSDynamicsDrawerViewController
是一个容器视图控制器,用于管理单个 "面板" 视图控制器和一层或两层 "抽屉" 视图控制器。抽屉视图控制器默认隐藏,但用户可以通过在抽屉视图控制器隐藏的方向的水平滑动来将其曝光。它使用 UIKit Dynamics 进行所有动画——项目中没有使用 animateWithDuration:animations:
的任何调用。
MSDynamicsDrawerViewController
集成了 Apple 的 UIKit Dynamics API(iOS7 中引入),为经典的抽屉导航范式提供了新的真实感。虽然下面的 .gifs
可以在这方面做得很好,但最好还是克隆、构建并在设备上运行示例项目来感受其性能。
将以下内容添加到您的 Podfile
中并运行 $ pod install
。
pod 'MSDynamicsDrawerViewController'
如果您还没有安装或整合 CocoaPods 到项目中,您可以在此学习如何做到这一点 链接。
MSDynamicsDrawerViewController
的文档可通过 CocoaDocs 在线获取。
如果您要安装 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
更改drawerView
、paneView
等元素的属性。
建议自定义样式类不要更改MSDynamicsDrawerViewController
实例中paneView
或drawerView
的frame
属性。这些属性既由用户的触摸操作,也由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.