sheets 0.9.2

sheets 0.9.2

Artyom Pstygo维护。



sheets 0.9.2

  • Artyom Pstygo

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引入了ScrollableScrollableDelegate协议。如果要将自定义视图作为SheetController的一部分适当滚动,您需要将滚动事件路由到delegate对象。

步骤

  1. 使您的视图/视图控制器符合Scrollable协议。
  2. scrollViewWillBeginDragging(_:)scrollViewDidScroll(_:)scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)中分别调用scrollableWillBeginDragging(_)scrollableDidScroll(_)scrollableWillEndDragging(_:withVelocity:targetContentOffset:)方法。

对于不需要覆盖上述UIScrollView方法的用户,sheets提供了两个方便的视图控制器:ScrollableTableViewControllerScrollableCollectionViewController。这些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 的默认锚点是 defaultExpandeddefaultCollapsed
  • defaultExpandeddefaultCollapsed 锚点的确切常量分别是顶部 20 点和底部 44 点。前者常量重复了 Apple Shortcuts 应用程序中类似表单的 UI 展开状态。后者常量有很多优点:足够用户拖动,并且当在表格内显示导航控制器时,导航栏在折叠状态下刚好触及底部。

示例

您可以在这个 示例应用程序中找到示例用例。

参考资料

这个库受到了 Yandex.Maps iOS 团队以下文章的启发

  1. 在 iOS 中实现自定义分页
  2. 可绘制的卡片 UI

许可协议

本库遵照 MIT 许可协议进行分发。