1

Я использую UICollectionViewFlowLayout, чтобы упорядочить просмотр фрагментов в горизонтальном прокрутке. По умолчанию, я заставляю их квадрат с помощью UICollectionViewDelegateFlowLayout:Анимация изменений в UICollectionViewFlowLayout

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 
} 

То, что я не понял, это как вызвать представление коллекции в) отзыве делегат на ретрансляцию и 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() 

Это вызывает расположение случиться! Но не анимация вообще. Он просто внезапно меняется. Кажется, что правая сторона плитки остается там, где она была, а не левая. Кажется, что это происходит после других изменений пользовательского интерфейса, которые я произвел между двумя вызовами.

+1

'performBatchUpdates (_: завершение:)'? – matt

+0

Хотите поставить это в форме ответа? Или я, если вы этого не сделаете. :) –

ответ

1

Ваша коллекцияView (_: 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) установит, что для вас.

+1

Даже не кажется, что нужно 'layoutIfNeeded()' –

+0

Интересно ... что я делаю, не работает вообще, если я его не называю. Изменения в дизайне коллекции выглядят странно. –

2

В частности, то, что я сделал:

self.myCollectionView.performBatchUpdates({ 
    self.causeSomeOtherVisualChanges() 
}, completion: { _ in 
    self.smyCollectionView.scrollToItem(at: index, at: .centeredHorizontally, animated: true) 
}) 
Смежные вопросы