我有一个UICollectionViewSubclass使用自定义UICOllectionViewLayout如何正确处理UICollectionViewLayout的itemSize的方向变化
如何做最好的我处理方向上的变化改变itemSize?
class CollectSubclass: UICollectionView {
/// When orientation changes, then invalidate the layout
open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if ((traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass) || (traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass)) {
collectionViewLayout.invalidateLayout()
}
}
}
一旦布局的方向变化无效, 我计算细胞的size.width
,到UICollectionView的的width
。
这工作了iPhone 7加模拟器的很好,但未能就小了模拟器像iPhone 7,5,SE等
看来,一旦invalidateLayout
被调用时,下面的函数被触发
/// Lays out subviews.
override open func layoutSubviews() {
super.layoutSubviews()
}
该函数依次调用UICollectionViewLayout
子类中的prepare
函数,其中我使用collectionView的新帧来计算单元格的大小。
在iPhone-7-Plus上,traitCollectionDidChange
被触发一次。一旦触发prepare
一次,触发layoutSubviews
。
然而,在较小的模拟器上,traitCollectionDidChange
被触发一次,但layoutSubviews
被触发两次。
在第一次触发layoutSubviews
时,UICO选择视图的帧大小为,几乎是它应该是什么。而在第二个触发器上,UICOllectionView的帧大小现在应该是正确的大小。
被两次调用两次不同的框架大小将导致我准备两次布局(这是非常昂贵的)。
有没有从UICOllectionViews和UICollectionViewLayouts子类中错过的东西?任何帮助表示赞赏。
我也可以在需要时
嗨,我无法使用'viewWillTransitionToSize'函数,因为我正在创建一个UICOllectionView子类,而不是UIViewCOntroller子类。我没有权限访问ViewController(仅作为collectionView的弱代理) –
有没有什么方法可以在不使用视图控制器的情况下知道'viewWillTransitionToSize'? –
不,但无论哪种视图控制器将实例化你的'UICollectionView'子类的实例,你都可以实现'viewWillTransitionToSize()'。然后在'viewWillTransitionToSize()'中,而不是调用'setCurrentCollectionCellDimensions(size)',调用'collectionView.setCurrentCollectionCellDimensions(size)'。你的一些逻辑必须来自视图控制器,其中一些将成为你的UICollectionView子类的一部分,但他们可以相互沟通。 – ClayJ