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의 현재 무엇이든 할 수있는 크기. 그러나, 나는 어떤 타일이 공칭 크기를 수정하는 조건이다, 그래서처럼 보이도록 약간의 진화 :

나는 A와 컬렉션보기를 트리거하는 방법입니다 파악하지 않은 무엇
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) 

이 또한 아무것도하지 않습니다. 나는 그것이 영리한 것인지 또는 무엇인지 확실하지 않습니다. 어쩌면 그들이 똑같고 선택을 취소 할만큼 똑똑 할 수도 있겠습니까? 이 레이아웃이 발생하는 원인 않습니다

self.schedulesView.startInteractiveTransition(
    to: self.schedulesView.collectionViewLayout, 
    completion: nil) 
self.schedulesView.finishInteractiveTransition() 

3)! 하지만 전혀 애니메이션이 아닙니다. 갑작스럽게 바뀝니다. 그것은 타일의 오른쪽을 유지하는 것처럼 보입니다. 왼쪽이 아니고 다른 UI가 변경된 후에 두 가지 호출간에 영향을 미쳤습니다.

+1

'performBatchUpdates (_ : 완료 :)'? – matt

+0

답변 양식에 넣으시겠습니까? 아니면 그렇지 않으면 내가 하겠소. :) –

답변

1

collectionView (_ : layout : sizeForItemAt :)가 나에게 맞습니다 (비슷한 점을 가지고 있습니다).

performBatchUpdates(_:completion:) AFTER you make your changes and BEFORE you call 레이아웃 필요 없음을 호출해야합니다.

// Some call that makes your call to `someTest()` in `collectionView(_:layout:sizeForItemAt:)` return what you want 
myCollectionView.performBatchUpdates(nil, completion: nil) 
myCollectionView.layoutIfNeeded() 

performBatchUpdates(_,completion)가 당신을 위해 설정되므로, myCollectionView.setNeedsLayout()를 호출 할 필요는 없습니다. , 내가 무슨 짓 특히

+1

'layoutIfNeeded()'가 필요하지 않은 것 같습니다. –

+0

흥미 롭습니다 ... 내가 전화하지 않으면 내가하고있는 일이 전혀 작동하지 않습니다. 콜렉션 레이아웃 변경 사항이 이상합니다. –

2

이었다

self.myCollectionView.performBatchUpdates({ 
    self.causeSomeOtherVisualChanges() 
}, completion: { _ in 
    self.smyCollectionView.scrollToItem(at: index, at: .centeredHorizontally, animated: true) 
})