2014-07-09 4 views
3

해결할 몇 가지 문제로 어려움을 겪고 있습니다.UicollectionViewCell에서 CollectionView의 크기를 업데이트하십시오.

저는 uicollectionview를 사용하여 앱을 만들고 있습니다. 여기에는 셀에 다른 uicollectionview가있을 수 있습니다. 셀의 크기는 해당 셀 내부의 uicollectionview의 전체 contentSize입니다.

I 앱이 stucture를 상상해 예

MainCollection 
    --Cell 
     ... 
    --Cell_6 
     --ColectionviewA 
     --Cell 
      ... 
     --Cell_66 
      -- CollectionViewB 
       --Cell_667 

상기 Cell_667의 크기가 웹으로부터 다운로드 한 비동기 이미지의 크기의 전체 동적 아코디언이다. 셀 다운로드가 이미지 인 후에 크기를 업데이트해야합니다. 난 내 문제를 발견 할 때

Theres는, 내가 전화 "collectionview 아버지"셀 너와의은 크기를 업데이트 할 수 있습니다, 다음 조언을 어떻게 MainCollection에 도달 할 때까지, 갱신을 "아버지"입니다 크기입니다.

뭔가 같은 :

Cell_667 (updateSizeCell) ->CollectionViewB (updateFrameSize) ->Cell_66 (updateSizeCell) ->CollectionviewA (updateFrameSize) ->Cell_6 (updateSizeCell) - >메인 콜렉션 (updatecontentSize)

목표는 한 번의 스크롤을 유지하는 것입니다. 간단한 해결책은 모든 셀을 다시로드하기 위해 MainCollection에 조언하는 것이었지만 나는 그것을 피하고 싶습니다. 어떻게하면이 방법을 더 효율적이고 깨끗하게 만드는가?

팁을 제공해 주시면 감사하겠습니다. 미리 감사드립니다.

답변

0

컬렉션보기의 contentSize이 변경되면 기본적으로 알아 내려고합니다. 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.

가장 간단한 방법은 아마 Key-Value Observing을 사용하는 것입니다.

컬렉션의 각보기를 초기화 한 후, 다음과 같이 그들에게 당신의 관찰자를 추가

[myCollectionView addObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize)) options:0 context:nil]; 

을 그리고, 구현, 실제 관측 방법 :

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqualToString:NSStringFromSelector(@selector(contentSize))]) 
    { 
     UICollectionView *updatedCollectionView = (UICollectionView *)object; 
     // update whatever you need to update here. 
    } 
} 

마지막 비트 단지에 기억된다 할당 해제 할 때 관찰자를 제거하십시오 (보기가 관찰자보다 오래가는 경우).

[myCollectionView removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))]; 

자세한 내용은 the documentationMattt Thompson's great post about it을 확인하십시오.

+0

하지만 여전히 문제가 있습니다. 내 collectionView 업데이트가 contentSize입니다. 셀 (누가 collectionView를 가졌는지)은 collectionView와 동일한 크기로 크기를 업데이트해야한다는 것을 알고 있습니까? – DaSilva

+0

'- (void) reloadItemsAtIndexPaths : (NSArray *) indexPaths'를 호출 해 보셨습니까?그런 다음 내부 컬렉션보기의 indexPath를 전달합니다. – Dima

+0

하지만 collectionView의 contentSize는 셀 자체의 크기를 변경하는 경우에만 커집니다. – DaSilva

관련 문제