4

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 の変更後に明確に発生するようです。

4

2 に答える 2

2

特に、私がしたことは次のとおりです。

self.myCollectionView.performBatchUpdates({ 
    self.causeSomeOtherVisualChanges()
}, completion: { _ in
    self.smyCollectionView.scrollToItem(at: index, at: .centeredHorizontally, animated: true)
})
于 2016-12-09T19:44:19.083 に答える
2

あなたの collectionView(_:layout:sizeForItemAt:) は私には正しいように見えます(似たようなものがあります)。

performBatchUpdates(_:completion:) AFTER you make your changes and BEFORE you calllayoutIfNeeded`を呼び出す必要があります。

// 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)ます。

于 2016-12-09T18:54:37.947 に答える