一个提供 窗帘控制器 的框架。窗帘控制器是一个容器视图控制器,它实现了内容帘幕的接口。
内容
概述
SweetCurtain 框架提供了一个 窗帘控制器。窗帘控制器是一个容器视图控制器,它可以管理内容帘幕接口中的两个子视图控制器。在这种类型的接口中,主要视图控制器(内容)被次级视图控制器(帘幕)覆盖。
在构建您的应用程序用户界面时,窗帘控制器通常是应用程序窗口的根视图控制器,但它也可以嵌入到另一个视图控制器中。窗帘控制器没有自己的显著外观。它的大部分外观由您安装的子视图控制器定义。您可以使用 Interface Builder 或通过 初始化器 programatically 来配置子视图控制器。子视图控制器可以是自定义视图控制器或其他容器视图控制器,例如导航控制器。
注意:您可以将窗帘控制器推送到导航堆栈中。它的子项可以包含在导航控制器或标签栏控制器中。但请记住,窗帘总是覆盖内容。例如,如果内容在导航控制器中嵌入,窗帘也会覆盖导航栏。
在屏幕上显示时,窗帘控制器使用其代理对象来传递窗帘变化的消息。此外,窗帘控制器提供窗帘对象以管理窗帘的属性。
特性
- 以系数为导向的度量。
- 友好的内容更改机制。
- 与故事板和代码一起工作。
- 设置和使用非常简单。
- 与安全区域兼容。
- 与滚动视图兼容。
- 与水平滚动或滑动兼容。
- 遵循iOS UI组件设计原则。
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 SweetCurtain 集成到您的 Xcode 项目中,在您的 Podfile
中指定它
platform :ios, '9.0'
use_frameworks!
target '<Your Target Name>' do
pod 'SweetCurtain'
end
然后,运行以下命令
$ pod install
Carthage
Carthage 是一个去中心化的依赖管理器,它构建您的依赖并提供二进制框架。
您可以使用以下命令使用 Homebrew 安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 SweetCurtain 集成到您的 Xcode 项目中,在您的 Cartfile
中指定它
git "https://github.com/multimediasuite/SweetCurtain"
运行 carthage update
来构建框架,并将构建的 SweetCurtain.framework 拖到您的 Xcode 项目中。
手动
如果您不希望使用上述任何依赖管理器,您可以手动将 SweetCurtain 集成到您的项目中。
用法与说明
使用Storyboard设置
- 创建一个视图控制器,并在 Identity Inspector 中将其类设置为 CurtainController。
- 创建另外两个您想要的视图控制器。一个将作为内容,另一个将作为 Curtain。
- 使用 Curtain Connection Segue 将您的 CurtainController 连接到新的视图控制器。
- 选择 Content 视图控制器的 Curtain Connection Segue,并在 Identity Inspector 中将其标识符键入为 ContentID。
- 选择 Curtain 视图控制器的 Curtain Connection Segue,并在 Identity Inspector 中将其标识符键入为 CurtainID。
一切就绪!
注意:请务必检查您的转场和转场标识符。这对正确设置流程非常重要。
使用代码设置
- 创建两个视图控制器,您可以使用它们作为 Content 和 Curtain。
//Also, you can instantiate your controllers from storyboard if you want it.
let contentViewController = IceCreamDetailViewController()
let curtainViewController = IceCreamListViewController()
- 使用上一步骤中创建的两个控制器创建一个 Curtain Controller。
let curtainController = CurtainController(content: contentViewController, curtain: curtainViewController)
- 在您想要的位置和时间显示
curtainController
。
show(curtainController, sender: nil)
一切就绪!
CurtainController
窗帘控制器是一个容器视图控制器,实现了内容窗帘接口。您可以使用Storyboard或从代码来创建Curtain Controller
。您所有的视图控制器都可以访问到curtainController
属性。这是一个计算属性,提供对视图控制器层次结构中最近的Curtain Controller
对象的访问。
Curtain Controller
对象具有一些属性和功能。
属性 | 类型 | 描述 |
---|---|---|
curtainDelegate |
CurtainDelegate? |
您希望接收有关其窗帘的Curtain Controller 消息的代理。 |
curtain |
Curtain! |
提供所有窗帘行为属性的_object。 |
创建新的Curtain Controller
的初始化器
init(content: UIViewController, curtain: UIViewController)
用于将窗帘移动到您想要的位置的功能
func moveCurtain(to position: CurtainHeightState, animated: Bool)
Curtain
Curtain
是Curtain Controller
的对象,提供了一些行为和视图定制的属性。但Curtain
不是视图。《Curtain》是一个用协议表示的抽象对象,其中的属性用于Curtain Controller
的目的。简单地说,Curtain
旨在减少混淆并限制设置在控制器中的职责。
属性 | 类型 | 描述 |
---|---|---|
minHeightCoefficient |
CGFloat | 描述窗帘最小允许高度与内容高度的比值的minHeightCoefficient |
midHeightCoefficient |
CGFloat? | 描述窗帘中间允许高度与内容高度的比值的中间值midHeightCoefficient |
maxHeightCoefficient |
CGFloat | 描述窗帘最大允许高度与内容高度的比值的最大值maxHeightCoefficient |
swipeResistance |
CurtainSwipeResistance |
窗帘的滑动阻力swipeResistance |
movingDuration |
TimeInterval | 达到最近点的秒数 |
topBounce |
Bool | 控制窗帘是否弹回顶部的布尔值topBounce |
bottomBounce |
Bool | 控制窗帘是否弹回底部的布尔值bottomBounce |
showsHandleIndicator |
Bool | 布尔值,控制窗帘是否显示顶部手持指示器 |
handleIndicatorColor |
UIColor |
窗帘手持指示器的颜色 |
heightCoefficient |
CGFloat | 当前只读值,描述窗帘实际高度与内容高度的比值heightCoefficient |
actualHeight |
CGFloat | 当前只读值,描述窗帘的实际高度actualHeight |
注意:
heightCoefficient
是描述窗帘位置的绝对值的属性。值为0表示如果约束没有干扰,actualHeight
也可能为0。值为1表示actualHeight
与safeAreaInsets.bottom
和safe area高度的总和相同。请参阅下面的图片以更好地理解。
消除命令代理
消除命令代理是允许接收来自消除命令控制器的消息的协议。消除命令代理提供了一组功能。
通知代理当消除命令切换其高度状态时
func curtain(_ curtain: Curtain, didChange heightState: CurtainHeightState)
通知代理当消除命令即将开始拖动时
func curtainWillBeginDragging(_ curtain: Curtain)
通知代理当消除命令中的拖动结束
func curtainDidEndDragging(_ curtain: Curtain)
通知代理当用户拖动消除命令时
func curtainDidDrag(_ curtain: Curtain)
消除命令高度状态
消除命令高度状态是消除命令高度状态的一个枚举器。
情况 | 描述 |
---|---|
最小 | 定义的最小高度状态。 |
中间 | 定义的中间高度状态。 |
最大 | 定义的最大高度状态。 |
隐藏 | 隐藏状态。 |
消除命令滑动阻力
消除命令滑动阻力是消除命令可用的预定义(或自定义)速度滑动阻力枚举器。
情况 | 描述 |
---|---|
任何 | 无阻力。速度值为0。 |
低 | 低阻力。速度值为300。 |
正常 | 正常阻力。速度值为600。 |
高 | 高阻力。速度值为900。 |
自定义(速度: CGFloat) | 自定义阻力。速度值为您设置的值。 |
UIViewController扩展
在SweetCurtain
框架中有一个公共的UIViewController扩展。
该扩展提供了curtainController
属性,它是视图控制器层次结构中距离最近的消除命令控制器。
注意:您可以从任何消除命令或内容视图控制器中找到
CurtainController
。例如,如果您的消除命令是UINavigationController并且您需要找到其顶部视图控制器的消除命令控制器,这将是很有用的。
扩展还提供了 func allowScrollViewInCurtain()
函数,允许层次结构中顶部滚动视图在帘幕滚动时同时进行滚动。
注意:您的 帘幕 视控制器可能包含 UIScrollView 或其任何子类。但默认情况下,它不会影响帘幕的滚动。如果您想启用层次结构中 最顶部滚动视图的并行滚动,请在你视图控制器中调用
func allowScrollViewInCurtain()
。
注意:函数
func allowScrollViewInCurtain()
在应用新观察之前重置了帘幕之前旧的滚动视图观察器。使用此函数时要格外小心。例如,如果您需要将导航控制器用作 帘幕,则建议在其视图控制器的func viewDidAppear(animated: Bool)
函数中调用此函数。
待办事项
- 在控制器中测试手势。
- 编写单元测试。
- 更新 iPad 和大手机的横幅屏幕。
- 为不正确使用编写日志消息。
- 更新动画参数以提高平滑性。
- 修复水平滚动视图工作。
- 添加描述如何正确使用 SweetCurtain 的视频。
- 添加 Swift 依赖性安装方式。
致谢
- Ihor Malovanyi (@multimediasuite)
许可
SweetCurtain 采用 MIT 许可发布。有关详细信息,请参阅 LICENSE 文件。