我正在使用Rack::Reloader.new(MyApp).reload!
在水平滚动视图中排列视图切片。默认情况下,我使用UICollectionViewFlowLayout
:
UICollectionViewDelegateFlowLayout
通过这种方式,我获得了方形瓷砖,其大小与func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
var nominalSize = CGSize(width: collectionView.frame.height, height: collectionView.frame.height)
return nominalSize
}
的电流大小无关。但是,有一种情况我会修改某些瓷砖的标称尺寸,所以它会变得有点看起来像:
collectionView
我还没想到的是如何触发集合视图到A)调用委托重新布局和B)如何使它变为动画。
我尝试过:
1)
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
var nominalSize = CGSize(width: collectionView.frame.height, height: collectionView.frame.height)
if someTest(indexPath) {
nominalSize = self.tweakNominalSize(nominalSize)
}
return nominalSize
}
这没有任何作用。委托回调中的self.myCollectionView.setNeedsLayout()
UIView.animateWithDuration(200.milliseconds) {
self.myCollectionView.layoutIfNeeded()
}
语句表明它永远不会被调用。
2)
print()
这也什么都不做。我不确定它是聪明还是什么。也许它足够聪明地注意到它们是相同的并且选择退出?
3)
self.schedulesView.setCollectionViewLayout(
self.schedulesView.collectionViewLayout,
animated: true)
这确实会导致布局发生!但根本没有动画。它只是突然改变了。它似乎保持了瓷砖右侧的位置,而不是左边的,它似乎在我在两次调用之间实现的其他UI更改后明显发生。
答案 0 :(得分:2)
特别是,我所做的是:
self.myCollectionView.performBatchUpdates({
self.causeSomeOtherVisualChanges()
}, completion: { _ in
self.smyCollectionView.scrollToItem(at: index, at: .centeredHorizontally, animated: true)
})
答案 1 :(得分:1)
你的collectionView(_:layout:sizeForItemAt :)对我来说是正确的(我有类似的东西)。
您需要致电performBatchUpdates(_:completion:) AFTER you make your changes and BEFORE you call
layoutIfNeeded`。
// Some call that makes your call to `someTest()` in `collectionView(_:layout:sizeForItemAt:)` return what you want
myCollectionView.performBatchUpdates(nil, completion: nil)
myCollectionView.layoutIfNeeded()
没有必要致电myCollectionView.setNeedsLayout()
,因为performBatchUpdates(_,completion)
会为您设置。{/ p>