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
ます。ただし、一部のタイルの公称サイズを変更する条件があるため、次のように少し進化します。
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
}
私が理解していないのは、コレクション ビューを A) デリゲートをリコールして再レイアウトする方法と、B) 変更をアニメーション化する方法です。
私が試したこと:
1)
self.myCollectionView.setNeedsLayout()
UIView.animateWithDuration(200.milliseconds) {
self.myCollectionView.layoutIfNeeded()
}
これは何もしません。print()
デリゲート コールバックのステートメントは、呼び出されないことを示しています。
2)
self.schedulesView.setCollectionViewLayout(
self.schedulesView.collectionViewLayout,
animated: true)
これも何もしません。それが賢いのかどうかはわかりません。たぶん、それらが同一であることに注意してオプトアウトするのに十分賢いでしょうか?
3)
self.schedulesView.startInteractiveTransition(
to: self.schedulesView.collectionViewLayout,
completion: nil)
self.schedulesView.finishInteractiveTransition()
これにより、レイアウトが発生します。しかし、まったくアニメーション化されていません。突然変わるだけです。タイルの左側ではなく右側を維持しているように見え、2 つの呼び出しの間に影響を与えた他の UI の変更後に明確に発生するようです。