在布局对象中访问集合视图的布局属性



我已经实现了一个UicollectionViewFlowLayout的子类,该类仅覆盖一种方法func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint。在这种方法中,我打算访问已经渲染的CollectionView的当前布局属性:ETECTIZE,SECTARTINSETSET等。

但是,当我尝试像 self.itemSize一样访问它时,它会返回默认值。

Apple Docs要求CollectionView代表为每个属性实现相应的委托方法:

如果代表不实现CollectionView:布局:SizeForiteMatindExpath:方法,流程布局对象使用此属性的值来设置每个部分的边距。

我在视图控制器中实现了所有这些委托方法。

现在,我的问题是,这些值是否不设置基础CollectionViewFlowLayout的对象的属性?如果委托对特定的相应选择器响应并避免将该值存储在相应的属性中,它是否总是检查吗?

这是访问CollectionView Flow对象中布局属性的正确方法吗?

let delegate = self.collectionView!.delegate as! UICollectionViewDelegateFlowLayout
let itemSize = delegate.collectionView(<#T##collectionView: UICollectionView##UICollectionView#>, layout: <#T##UICollectionViewLayout#>, sizeForItemAt: <#T##IndexPath#>)

如果是的,为什么这么长的方法?如果没有,我缺少什么?

如果所有单元格的大小相同,则应设置itemSize并不使用委托方法。您可以通过选择收集视图,选择大小检查器并设置单元格大小来在接口构建器中进行设置。或者,您可以在UICollectionViewFlowLayout子类的生命周期中设置此设置。

如果单元格的大小是动态的,则您需要调用委托方法以确定大小。正确的是,您需要通过收集视图访问delegate。这可能是因为UICollectionViewDelegateFlowLayout扩展了UICollectionViewDelegate。添加一个辅助登录器,例如:

var delegate: UICollectionViewDelegateFlowLayout? {
    return collectionView?.delegate as? UICollectionViewDelegateFlowLayout
} 

可以使其更容易使用。

但是,当布局无效时,您实际上只需要向代表询问尺寸信息。layoutAttributesForItem(at: indexPath)layoutAttributesForElements(in: rect)似乎可用于确定已经布置的项目的尺寸信息。两者都是UICollectionViewFlowLayout上的方法。

最新更新