更新资料
使用指定的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()
起作用的原因是因为它将使用您的其他布局代码来计算大小。