UICollectionViewFlowLayout

UICollectionViewFlowLayout

更新资料
使用指定的collectionViewContentSize()方法时,该问题似乎已解决:

let contentSize = collectionViewContentSize()
不过,我会对这种行为背后的解释非常感兴趣,因此我相应地更新了我的问题。
原始问题
我试图重新创建在this article的第一个示例中找到的步骤,但是使用Swift和Storyboards。
我有一个具有以下内容的自定义UICollectionViewFlowLayout子类:
导入UIKit
class SpringyFlowLayout: UICollectionViewFlowLayout {

    private lazy var animator: UIDynamicAnimator = {
        return UIDynamicAnimator(collectionViewLayout: self)
        }()

    override func prepareLayout() {
        super.prepareLayout()

        let contentSize = collectionView!.contentSize
        let items = super.layoutAttributesForElementsInRect(CGRect(origin: CGPointZero, size: contentSize)) as! [UICollectionViewLayoutAttributes]

        if animator.behaviors.isEmpty {
            for item in items {
                let spring = UIAttachmentBehavior(item: item, attachedToAnchor: item.center)
                spring.length = 0
                spring.damping = 0.8
                spring.frequency = 1.0
                animator.addBehavior(spring)
            }
        }
    }

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
        return animator.itemsInRect(rect)
    }


    override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
        return animator.layoutAttributesForCellAtIndexPath(indexPath)
    }

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        let delta = newBounds.origin.y - collectionView!.bounds.origin.y
        for spring in animator.behaviors {
            let items = spring.items as! [UICollectionViewLayoutAttributes]
            if let attributes = items.first {
                attributes.center.y += delta
                animator.updateItemUsingCurrentState(attributes)
            }
        }
        return false
    }
我在情节提要中设置了正确的布局类。当我运行该应用程序时,我的收藏夹视图为空。
我确定该问题已在以下代码片段中删除:
override func prepareLayout() {
        super.prepareLayout()

        let contentSize = collectionView!.contentSize
        let items = super.layoutAttributesForElementsInRect(CGRect(origin: CGPointZero, size: contentSize)) as! [UICollectionViewLayoutAttributes]
//...
}
因为我继承了UICollectionViewFlowLayout的子类,所以我认为我可以依靠 super 实现为我布置元素,然后修改它们的属性。但是当我检查contentSize时,它正确报告了宽度,但是高度为0。
这将导致一个空项目数组-> animator中没有任何行为-> animator.itemsInRect(_)返回一个空数组->空集合视图。
我似乎无法找出我所缺少的。由于我使用的是流程布局,因此无需覆盖contentSize()方法。

最佳答案

collectionView尚无内容大小的问题,因为它只是开始准备其布局。我不相信调用collectionView!.contentSize实际上会计算出大小。 collectionViewContentSize()起作用的原因是因为它将使用您的其他布局代码来计算大小。

09-20 10:21