UICollectionView水平页面之间的空间分页

我正在寻找一种方法来取代UIPageViewController本地UIPageViewController水平分页。

到目前为止我做了以下几点:

 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相同的行为:单元格应填充整个屏幕宽度,单元格之间的空间应该只在切换页面时可见。

解决scheme一:

  1. 不要使用collectionView.isPagingEnabled = true将其设置为false
  2. 为页面之间的距离添加minimumLineSpacing
  3. 实现targetContentOffsetForProposedContentOffset:withScrollingVelocity:将contentOffset移动到最近的页面。 您可以根据您的itemSizeminimumLineSpacing以简单的math计算页面,但可以花费一点工作才能正确使用。

解决scheme二:

  1. collectionView.isPagingEnabled = true
  2. 为页面之间的距离添加minimumLineSpacing
  3. 分页大小基于collectionView的边界。 所以使collectionView大于screenSize。 例如,如果您的minimumLineSpacing为10,则将collectionView的框架设置为{0,-5,宽度+ 10,高度}
  4. 设置contentInset等于minimumLineSpacing使第一个和最后一个项目正确显示。
  • 默认情况下,UICollectionViewFlowLayout的minimumLineSpacing为10.0,当collectionView的项目被水平填充(itemSize.width = collectionView.bounds.width)且collectionView是分页启用时,大于零'minimumLineSpacing'将导致意外的性能:从第二页开始,每页有一个空白,将被页码累积。
  • 看来我们可以通过'minimumLineSpacing'来扩展collectionView的宽度来解决这个问题。 但实践否定了这个解决scheme:当有两页或更多的页面时,collectionView不会给最后一个'lineSpacing',所以'contentSize'不足以完全显示这个页面的内容,这意味着如果'minimumLineSpacing'是10.0 ,最后一页的结尾会超过collectionView的contentSize 10.0。
  • 最后,我使用以下简单的解决scheme在每个项目之间插入一个边距(如UIScrollView的性能):将固定值“pageSpacing”(例如10.0)展开每个collectionViewItem的宽度,然后将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) } } 

希望能帮助你。