1

私はちょっと初心者で、与えられたアクションでUICollectionView動的に変更するプロジェクトで働いています 。UICollectionViewLayout

私のCollectionViewには6つのセクションがあり、それぞれに10個の要素があります。これらのセルは基本的にはUIImageViewであり、私のカスタムレイアウトはStackViewLayout、各セクションのすべての要素をスタックします(AppleのPhotos.appのようなもの)。

ユーザーがスタックの要素(すべてのセクション)を選択するとUICollectionView、レイアウトが動的にに変更されるUICollectionViewFlowLayoutため、すべての要素をグリッドとして表示できます。

私の問題は、ユーザーがスタックを選択すると、どのセクションに関係なく、レイアウトが変更されたときにフローレイアウトを実行すると、選択したセクション(スタック)の要素が表示されるのではなく、すべてのセクションがグリッドに表示されることです。これが動作です。欲しかった。

カスタムレイアウトで選択したセクションのフローレイアウトのみを表示する方法はありますか?

これが私のコントローラー実装スニペットコードです:

- (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];
    }
}
4

1 に答える 1

1

numberOfItemsInSection: メソッドに if 句を付けて、選択されていないセクションに対して 0 を返すことで、おそらくそれを行うことができると思います。明らかに、これを行うには、選択したセクションを追跡する必要があります。

于 2013-02-16T20:23:59.383 に答える