serviceName
您一直想要拥有那种像在地图或捷径中那样的卡片样式控制器,对吧?现在您可以通过sheets免费拥有它!sheets提供了一个易于使用的容器控制器,具有与UINavigationController类似的API。
安装
Swift包管理器
需要XCode 11。在项目菜单下的Swift包中,通过URL添加sheets。
CocoaPods
在Podfile中添加下列内容
pod sheets
使用方法
面向sheets的概念很简单。sheets提供了SheetController
容器视图控制器。它包含一个主要视图控制器和一个或多个视图控制器,这些视图控制器在sheets中呈现在。主要视图控制器是sheet背后的内容。此控制器在初始化后(至少现在)不能更改。sheets内的视图控制器是动态的,这意味着可以根据需要推入和弹出,尽管堆栈中必须至少有一个VC(在卡片内没有任何视图控制器并没有太多意义)。
要在项目中开始使用sheets,请通过init(mainViewController:rootViewController:anchors:)
初始化器初始化SheetController
,然后展示它,就像展示任何其他视图控制器一样。
滚动行为
为了使用户能够通过其内容拖动sheets,SheetController
必须成为UIScrollView
的代理。不幸的是,设置一些滚动视图(例如UITableView
必须是其自己的代理)的delegate
属性是直接不可能的。此外,各个滚动视图API的用户可能想要自行截获滚动回调。
为了解决这个问题,sheets
引入了Scrollable
和ScrollableDelegate
协议。如果要将自定义视图作为SheetController
的一部分适当滚动,您需要将滚动事件路由到delegate
对象。
步骤
- 使您的视图/视图控制器符合
Scrollable
协议。 - 在
scrollViewWillBeginDragging(_:)
scrollViewDidScroll(_:)scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)中分别调用scrollableWillBeginDragging(_)
scrollableDidScroll(_)scrollableWillEndDragging(_:withVelocity:targetContentOffset:)方法。
对于不需要覆盖上述UIScrollView
方法的用户,sheets
提供了两个方便的视图控制器:ScrollableTableViewController
和ScrollableCollectionViewController
。这些VC从一开始就是Scrollable
的!
自定义
选项
SheetController可以通过一系列方便的选项进行自定义。这些选项包括
选项 | 描述 | 默认值 |
---|---|---|
isExpandGestureEnabled |
控制卡片头部上的点击是否使其展开。 | true |
isCollapseGestureEnabled |
控制点击主视图控制器是否在完全展开时使卡片折叠。 | true |
cancelsTouchesInCollapsedState |
控制当卡片折叠时是否阻止对卡片的上 taps 操作。 当启用时将会影响内容的拖动,将在未来更新中解决。 | false |
hidesTabBarUponExpansion |
控制当卡片扩展时,SheetController 是否尝试隐藏标签栏(如果存在)。 |
true |
bounces |
控制卡片动画的弹簧阻尼。如果设置为 false ,则阻尼设置为 1.0,这将禁用弹跳。 |
true |
animatesCorners |
控制当卡片折叠时,卡片的圆角半径是否设置为 0.0。此行为与 Music 的卡片 UI 相似。 | false |
closeButtonImage |
将此属性设置为您的自定义关闭按钮图片。 | nil |
hasChevron |
控制每个卡片顶部是否存在向导指示器。 | false |
锚点
另一个可定制的点是对锚点的定制。锚点定义了高度,当用户停止拖动时,表单会自动来回弹。锚点本身定义为 Anchor
枚举。它的案件是
Case | 描述 |
---|---|
ratio(CGFloat) |
相关值是 0.0 到 1.0 之间的比率,其中 0.0 表示屏幕的顶部,1.0 表示屏幕的底部。 |
pointsFromTop(CGFloat) |
相关值定义了从顶部锚点有多远。 |
pointsFromBottom(CGFloat) |
相关值定义了从底部锚点有多远。 |
defaultExpanded |
将锚点放在屏幕顶部附近。 |
defaultCollapsed |
将锚点放在屏幕底部附近。 |
可以在初始化期间或通过 setAnchors(_:animated:snapTo:)
方法设置锚点。
说明:
- 从
anchors
计算的高度相对于视图的安全区域进行计算,因此您不必担心导航栏、标签栏和工具栏。 - 您不必按任何特定顺序排列锚点。
- 每个
SheetController
的默认锚点是defaultExpanded
和defaultCollapsed
。 defaultExpanded
和defaultCollapsed
锚点的确切常量分别是顶部 20 点和底部 44 点。前者常量重复了 Apple Shortcuts 应用程序中类似表单的 UI 展开状态。后者常量有很多优点:足够用户拖动,并且当在表格内显示导航控制器时,导航栏在折叠状态下刚好触及底部。
示例
您可以在这个 示例应用程序中找到示例用例。
参考资料
这个库受到了 Yandex.Maps iOS 团队以下文章的启发
许可协议
本库遵照 MIT 许可协议进行分发。