Swift:按屏幕分页不适用于两列布局集合视图

Posted

技术标签:

【中文标题】Swift:按屏幕分页不适用于两列布局集合视图【英文标题】:Swift: paging by screen doesn't work for two column layout collection view 【发布时间】:2017-02-08 04:48:44 【问题描述】:

我有一个带有自定义 2 列布局的 collectionview 控制器:

class CVLayout: UICollectionViewFlowLayout 

override init() 
    super.init()
    setupLayout()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    setupLayout()


override var itemSize: CGSize 
    set 

    
    get 
        let numberOfColumns: CGFloat = 2

        let itemWidth = (self.collectionView!.frame.width - (numberOfColumns - 1)) / numberOfColumns
        return CGSize(width: itemWidth, height: itemWidth)
    


func setupLayout() 
    minimumInteritemSpacing = 1
    minimumLineSpacing = 1
    scrollDirection = .horizontal

在我的控制器中我设置了

class ViewController: UICollectionViewController 

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    collectionView?.isScrollEnabled = true
    collectionView?.isPagingEnabled = true

我有 7 个项目,屏幕上显示了 6 个项目,我希望在下一页看到一个项目,但我看到的是 4 个(上一页中的 3 个) 我试图玩一些部分和部分中的项目,但这没有帮助。我从其他主题中发现的是,默认分页应该是按屏幕,而不是按单元格(在我的例子中是一列)。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

如果我理解您的问题,我认为您本身并没有做错什么。集合视图的内容大小(部分)由项目大小决定。现在,这大约是 3 个项目(或一页半内容)的宽度。我认为您需要覆盖集合视图的内容大小属性以反映整页内容(宽度)以达到预期的效果。

override var collectionViewContentSize: CGSize 

    if  let collectionView = collectionView 
        let numberOfItems = collectionView.numberOfItems(inSection: 0)
        let pages = numberOfItems/2
        let size =  CGSize(width: collectionView.frame.width * CGFloat(pages), height: collectionView.frame.height)
        return size
    

    return CGSize(width: 0, height: 0)

请看这个答案How to expand UICollectionView contentSize when paging enable?。它有点旧,但我认为它正在尝试解决同样的问题。

【讨论】:

这就是我想要的!我稍微更改了您的代码(计算页数)。而且我还必须减去导航栏的高度,否则我的收藏视图会在滚动时跳起来。谢谢!【参考方案2】:

首先 UICollectionViewFlowLayout 不支持分页

我认为有两种解决方案

第一

使用 UIScrollView 只需通过分页选项添加 7 个项目

使用 UICollectionView 修改你的 UICollectionViewFlowLayout

子类 UICollectionViewFlowLayout 以支持分页

例如)

在 Swift3 中

class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout 
    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint 
        var offsetAdjustment = CGFloat.greatestFiniteMagnitude
        let horizontalOffset = proposedContentOffset.x
        let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: self.collectionView!.bounds.size.width, height: self.collectionView!.bounds.size.height)
        for layoutAttributes in super.layoutAttributesForElements(in: targetRect)! 
            let itemOffset = layoutAttributes.frame.origin.x
            if abs(itemOffset - horizontalOffset) < abs(offsetAdjustment)
                offsetAdjustment = itemOffset - horizontalOffset
            
        
        return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y)
    

更多信息可以搜索UICollectionViewFlowLayout with Paging

【讨论】:

以上是关于Swift:按屏幕分页不适用于两列布局集合视图的主要内容,如果未能解决你的问题,请参考以下文章

分页不适用于交错网格布局android

分页不适用于 11ty(十一)中的可扩展布局

分页列表不适用于具有多个模型的视图

Laravel 分页不适用于数组而不是集合

过滤和分页不适用于 ngxpagination 模板

Ajax 请求不适用于数据表分页