Sundial
UICollectionView 布局,具有包含标题和选择标记的页眉,用于分页导航。
示例
要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install
。
要求
安装
Sundial 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'Sundial'
使用
1. 入门
将日晷布局集成到常规UICollectionViewLayout中
let collectionView = CollectionView<CollectionViewPagerSource>()
collectionView.source.pager = self
collectionView.collectionViewLayout = CollectionViewLayout(hostPagerSource: collectionView.source) { [weak self] in
return ["Title1", "Title2", "Title3"]
}
您需要做的唯一事情是返回标题数组和提供实现Selectable
协议。Astrolabe的页面提供者符合该协议。
1.1 设置
Sundial提供通过设置结构对基本UI和行为进行自定义的功能
public struct Settings {
public var stripHeight: CGFloat
public var markerHeight: CGFloat
public var itemMargin: CGFloat
public var bottomStripSpacing: CGFloat
public var backgroundColor: UIColor
public var anchor: Anchor
public var inset: UIEdgeInsets
public var alignment: PagerHeaderSupplementaryAlignment
public var pagesOnScreen: Int
public var jumpingPolicy: JumpingPolicy
}
Sundial的一种酷炫特性是“跳跃”。您可以将跳转策略设置为在页面切换时跳过位于彼此较远处的页面,使得看起来像是切换到了邻居页面
1.2 锚点
以下是可能的锚点列表
public enum Anchor {
case content
case centered
case fillEqual
case equal(size: CGFloat)
case left(offset: CGFloat)
case right(offset: CGFloat)
}
内容 | 居中 |
---|---|
左对齐 | 等宽填充 |
1.3 自定义装饰视图
这里定义了Sundial布局中的默认装饰视图
public typealias DecorationView = GenericDecorationView<TitleCollectionViewCell, MarkerDecorationView<TitleCollectionViewCell.Data>, DecorationViewAttributes<TitleCollectionViewCell.Data>>
public typealias CollectionViewLayout = GenericCollectionViewLayout<DecorationView>
public typealias CollapsingCollectionViewLayout = GenericCollapsingCollectionViewLayout<DecorationView>
如您所见,您可以配置默认装饰视图本身,提供其他的TitleCell
或MarkerCell
类。或者,如果您的项目需要,如果需要提供其他类型的装饰视图满足DecorationViewPageable
协议。例如
typealias CustomDecoration = GenericDecorationView<CustomTitleCollectionViewCell, CustomMarkerDecorationView, DecorationViewAttributes<CustomTitleCollectionViewCell.Data>>
typealias CustomLayout = GenericCollectionViewLayout<CustomDecoration>
2. 折叠头部
Sundial也提供了可折叠头部的布局 —— CollapsingCollectionViewLayout
。其创建方式几乎与CollectionViewLayout
相同。唯一的区别是,你需要提供CollapsingItem
协议的实现。
let collectionView = CollectionView<CollectionViewPagerSource>()
typealias Layout = CollapsingCollectionViewLayout
let items = [controller1, controller2, controllerLoader, controller4, controller5]
let layout = Layout(items: items, hostPagerSource: collectionView.source) { [weak self] in
return self?.titles ?? []
}
CollapsingItem
实现的示例
class TestViewController: UIViewController, Accessor, CollapsingItem {
let visible = BehaviorRelay<Bool>(value: false)
var scrollView: UIScrollView {
return containerView
}
这就是结果
3. 发布
当使用基于内容的锚点时,你必须提供Distribution
中的一个值。
public enum Distribution {
case left, right, center, proportional, inverseProportional, equalSpacing
}
当提供标题的内容不适合头部宽度时,标题将根据提供的方式进行分布。标题的内容大小来源于标题单元格。默认实现是TitleCollectionViewCell
。如果你需要提供自定义大小,你必须实现自己的单元格并提供自定义的Data
,它将实现Titleable
协议。
0. 缺失的要点
- 更多锚点
- 在装饰视图中滚动UICollectionView的能力
许可
Sundial遵循MIT许可。更多信息请参阅LICENSE文件。