gpt4 book ai didi

ios - UICollectionViewFlowLayout : collectionView! .contentSize 与 collectionViewContentSize

转载 作者:搜寻专家 更新时间:2023-11-01 06:23:01 27 4
gpt4 key购买 nike

更新

当使用指定的 collectionViewContentSize() 方法时,问题似乎已解决:

let contentSize = collectionViewContentSize()

不过,我对这种行为背后的解释非常感兴趣,因此我相应地更新了我的问题。

原始问题

我正在尝试重新创建在 this article 的第一个示例中找到的步骤,但使用 Swift 和 Storyboard。

我有一个自定义的 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
}

我在 Storyboard中设置了正确的布局类。当我运行应用程序时,我的收藏 View 是空的。

我确定问题出在以下片段中:

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(_) 返回一个空数组 -> 空的 Collection View 。

我似乎无法找出我错过了什么。应该不需要重写 contentSize() 方法,因为我使用的是流式布局。

最佳答案

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

关于ios - UICollectionViewFlowLayout : collectionView! .contentSize 与 collectionViewContentSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29916829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com