UICollectionViewFlowLayout中的动画更改

时间:2016-12-09 17:55:13

标签: ios uicollectionview uicollectionviewlayout uicollectionviewdelegate

我正在使用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更改后明显发生。

2 个答案:

答案 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>