我正在寻找一种替代原生的方法 UIPageViewController
水平分页用 UICollectionView
。
到目前为止,我做了以下事情:
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.itemSize = collectionView.frame.size
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 10
collectionView.setCollectionViewLayout(layout, animated: false)
collectionView.isPagingEnabled = true
collectionView.alwaysBounceVertical = false
这工作正常,我得到一个水平的分页效果。
现在我想在页面之间添加水平空间(就像你将要做的那样) UIPageViewControllerOptionInterPageSpacingKey
上 UIPageViewController
)
到目前为止,我无法在不损坏分页效果的情况下添加空格。
即时寻找与此相同的行为 UIPageViewController
:单元格应填充整个屏幕宽度,单元格之间的空间应仅在切换页面时可见。
- 默认情况下,UICollectionViewFlowLayout的minimumLineSpacing为10.0,当collectionView的项目水平填充(itemSize.width = collectionView.bounds.width)且collectionView启用分页时,大于零'minimumLineSpacing'将导致意外的性能:从第二页开始,每页有一个差距将由页码累计。
- 似乎我们可以通过'minimumLineSpacing'扩展collectionView的宽度来解决这个问题。但是pratice否定了这个解决方案:当有多个页面或者更多页面时,collectionView不会给最后一个页面提供'lineSpacing',所以'contentSize'不足以完全显示这个页面的内容,这意味着如果'minimumLineSpacing'是10.0 ,最后一页的结尾将超过collectionView的contentSize 10.0。
- 最后,我使用以下简单的解决方案在每个项目之间插入一个边距(如UIScrollView的预处理):将每个collectionViewItem的宽度展开一个固定值'pageSpacing'(例如10.0),并将collectionView的宽度扩展为相同的值。并且不要忘记,当布局collevtionViewCell的子视图时,还有一个额外的间距,不是用于绘制实际内容。
继续使用Swift 3.1编写的代码,我确信它很容易为您理解:
let pageSpacing: CGFloat = 10
class ViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: view.frame.width + pageSpacing, height: view.frame.height)
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
let frame = CGRect(x: 0, y: 0, width: view.frame.width + pageSpacing, height: view.frame.height)
let collectionView = UICollectionView(frame: frame, collectionViewLayout: layout)
view.addSubview(collectionView)
}
}
class MyCell: UICollectionViewCell {
var fullScreenImageView = UIImageView()
override func layoutSubviews() {
super.layoutSubviews()
fullScreenImageView.frame = CGRect(x: 0, y: 0, width: frame.width - pageSpacing, height: frame.height)
}
}
希望能帮到你。