2013-02-16 5 views
1

저는 다소 신참 인 UICollectionView에 있습니다. 주어진 작업에서 UICollectionViewLayout을 동적으로 변경하는 프로젝트에서 일하고 있습니다.iOS 6 CollectionView 동적으로 레이아웃을 변경합니다.

내 CollectionView에는 6 개의 섹션이 있으며 각 섹션에는 10 개의 요소가 있습니다. 그 셀들은 기본적으로 UIImageView이고, 사용자 정의 레이아웃 인 StackViewLayout은 각 섹션 (Apple의 Photos.app와 같은 것)의 모든 요소를 ​​스택합니다.

사용자가 스택의 요소를 선택하면 (모든 섹션에 대해) UICollectionView은 동적으로 레이아웃을 UICollectionViewFlowLayout으로 변경하므로 모든 요소를 ​​눈금으로 볼 수 있습니다.

내 문제는 사용자가 스택을 선택하면 레이아웃이 변경되면 레이아웃이 변경 될 때 선택된 섹션 (스택)에 대한 요소를 표시하는 대신 모든 섹션이 표에 표시된다는 것입니다. 내가 원하는 행동입니다.

사용자 지정 레이아웃에서 선택한 섹션의 흐름 레이아웃 만 표시 할 수있는 방법이 있습니까? 선택한 일이 아니다 어떤 부분에 0을 반환하는 방법에있어서, 당신의 numberOfItemsInSection에 절 경우를함으로써 나는 당신이 그것을 할 아마 수 있다고 생각

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self loadStackLayout]; // stack all sections at first load. 
} 

#pragma mark - UICollectionView Data Source Methods 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 6; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 10; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    // custom UICollectionViewCell, which will hold an image. 
    CVCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];   
    cell.imageView.image = _images[indexPath.row]; 
    return cell; 
} 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // element size. 
    return CGSizeMake(100,100); 
} 

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (isStacked) 
    { 
     [self loadFlowLayout]; //HERE I WANT TO LOAD FLOW LAYOUT ONLY FOR THE SECTION OF THE SELECTED ITEM! 
    } else 
     { 
      // to implement. 
     } 
} 

// HERE IS THE METHOD THAT CALLS MY CUSTOM LAYOUT IN ORDER TO STACK THE ELEMENTS FOR EACH SECTION IN COLLECTION VIEW. IT IS WORKING AS IT SHOULD. 
-(void)loadStackLayout 
{ 
    if (([self.collectionView.collectionViewLayout isKindOfClass:[UICollectionViewFlowLayout class]])) 
    { 
     isStacked = YES; 
     [self.collectionView setCollectionViewLayout:[[StackViewLayout alloc] init] animated:YES]; 
    } 
} 

// HERE IS THE METHOD THAT CALLS MY FLOWLAYOUT IN ORDER TO UN-STACK THE ELEMENTS AND SHOW THEM IN A GRID. CURRENTLY IT IS SHOWING ALL SECTIONS IN THE GRID. 
-(void)loadFlowLayout 
{ 
    if (([self.collectionView.collectionViewLayout isKindOfClass:[StackViewLayout class]])) 
    { 
     isStacked = NO; 
     [self.collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init] animated:YES]; 
    } 
} 

답변

1

:

은 여기 내 컨트롤러 구현 코드 조각입니다. 분명히, 당신은 이것을하기 위해 선택된 섹션을 추적 할 필요가있을 것이다.

+0

글쎄 나는 numberOfItensInSection의 모든 섹션에 대해 0을 반환하려고 시도했지만 xcode는 나에게 잘못된 액세스 권한을 부여합니다. if 절은 선택되지 않은 섹션에 대해 1 항목을 반환하고 스택에서 섹션 0을 선택하면 작동합니다 (탭합니다). 다른 조합으로 인해 응용 프로그램이 충돌합니다. – lsp

관련 문제