4

我正在使用 aUICollectionViewFlowLayout在水平滚动视图中排列视图图块。默认情况下,我使用以下命令将它们设为正方形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()

这确实会导致布局发生!但根本没有动画。它只是突然改变。它似乎将磁贴的右侧保持在原来的位置,而不是左侧,并且它似乎在我在两次调用之间进行了其他 UI 更改之后明显发生。

4

2 回答 2

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 回答
2

特别是,我所做的是:

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