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



>我有一个带有自定义 2 列布局的集合视图控制器:

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 个(我试图玩一些部分和部分中的项目,但它没有帮助。我从其他主题中发现,默认分页应该是按屏幕,而不是按单元格(在我的例子中是一列(。我做错了什么?

如果我理解你的问题,我认为你本身并没有做错任何事。集合视图的内容大小(部分(由项目大小决定。现在,这大约是 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)
}

请参阅此答案 如何扩展 UI 启用分页时查看内容大小?.它有点旧,但我认为它正在尝试解决同样的问题。

首先 UICollectionViewFlowLayout 不支持分页

我认为有两种解决方案

第一

使用

UIScrollView 只需使用分页选项即可添加 7 个项目

第二

使用 UICollectionView 修改您的 UI CollectionViewFlowLayout

子类 UICollectionViewFlowLayout 以支持分页

例如(

在雨燕3中

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

最新更新