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

问题描述:

我正在寻找一种方法来取代本地UIPageViewController水平分页与UICollectionViewUICollectionView水平分页页面之间的空间

到目前为止,我做了以下内容:

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 

这工作得很好,我也得到一个水平分页效果。

现在,我想补充的水平空间的页面之间的(像你将与UIPageViewControllerOptionInterPageSpacingKeyUIPageViewController做)

到目前为止,我可以不精的方式来增加空间,而不会损坏分页效果。 即时通讯寻找与UIPageViewController相同的行为:单元格应填充整个屏幕宽度,并且单元格之间的空间应仅在切换页面时可见。

解决方法一:

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

解决方法二:

  1. collectionView.isPagingEnabled = true
  2. 添加minimumLineSpacing
  3. 分页大小是基于的CollectionView的界限页面之间的距离。因此,使collectionView变大然后screenSize。例如,如果您的minimumLineSpacing为10,则将collectionView的框架设置为{0,-5,宽度+ 10,高度}
  4. 将contentInset设置为等于minimumLineSpacing,以使第一个和最后一个项目正确显示。
+0

但那么这将是难以复制的所有分页行为 – Eyal

+0

你说得对,我添加了一个简单的解决方案 –

+0

伟大的想法,感谢 – Eyal

  • 默认情况下,UICollectionViewFlowLayout的minimumLineSpacing为10.0,当时的CollectionView的项目水平填充(itemSize.width = collectionView.bounds.width)和的CollectionView进行分页启用,除零“minimumLineSpacing”更大会导致意想不到的性能:从第二页开始,每一页都有一个空白,这个空白将被页码累积。
  • 看来我们可以通过'minimumLineSpacing'来扩展collectionView的宽度来解决这个问题。但实践否定了这个解决方案:当有两页或更多页面时,collectionView不会给最后一个'lineSpacing',因此'contentSize'不足以完全显示该页面的内容,这意味着如果'minimumLineSpacing'是10.0 ,最后一页的结尾会超出collectionView的contentSize 10.0。
  • 最后,我使用以下简单的解决方案在每个项目之间插入边距(如UIScrollView的性能):将每个collectionViewItem的宽度扩展固定值'pageSpacing'(如10.0),并将collectionView的宽度扩大相同的值也是。不要忘了,在布局collevtionViewCell的子视图时,还有一个额外的空间,它不是用于显示真实内容。

继承人写在雨燕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) 
    } 
} 

希望能帮助你。