如何在2个不同的UICollectionViewFlowLayout实例之间切换?

时间:2014-04-23 13:34:30

标签: ios objective-c cocoa-touch uicollectionview uicollectionviewcell

现在已经有几天了。我正在尝试允许应用的客户在购物时在两种显示类型之间切换。

现在我正在使用2个UICollectionView和他们自己的自定义UICollectionViewCell,并且两者之间的切换工作正常,但我发现使用2个不同的UICollectionView' s正在变得痛苦。我为我的主要UICollectionView实施的某些内容在替代UICollectionView中无效。

这是显示更改的方式。我使用自定义方法UISegmentedControl

enter image description here

- (void)displayTypeSegmentSelected
{
    _selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];


    if (_selectedDisplayTypeIndex == 0) {
        NSLog(@"Single file item view selected");
        _fromCollectionView = _collectionView;
        _toCollectionView = _collectionView2;


    } else if (_selectedDisplayTypeIndex == 1) {
        NSLog(@"Grid style view selected");
        _fromCollectionView = _collectionView2;
        _toCollectionView = _collectionView;
    }

    [_fromCollectionView removeFromSuperview];

    [_toCollectionView setFrame:[_superView bounds]];
    [_superView addSubview:_toCollectionView];

}

我通过stackoverflow提出了两个不同的建议,说明了我正在尝试做的更好的方法。

  1. 使用2 UICollectionViewFlowLayout并在它们之间切换而不是2 UICollectionView
  2. 根据所选的细分,返回相应的自定义UICollectionViewCell
  3. 我觉得第一种方式会更好。我需要使接口构建器UICollectionViewFlowLayout成为IBOutlet,因为未以编程方式创建连接的UICollectionView。然后我以编程方式创建第二个UICollectionViewFlowLayout

    在我的displayTypeSegmentSelected方法中,我根据所选的段加载两个UICollectionViewFlowLayout中的一个。

    单个文件显示如下所示:

    enter image description here

    网格样式显示如下所示:

    enter image description here

    问题:

    我认为我有正确的想法去做我原来的问题以及如何做的最佳方式。但是,我会从一个更有经验的开发人员那里得到一个意见和例子。 你会怎么做到这一点,你能告诉我一个明确的例子,我可以去搞乱吗?

    亲切的问候

2 个答案:

答案 0 :(得分:2)

这就是我最终做的事情。

点击特定的分段控件后,我更改了布局并重新加载了单元格。

- (void)displayTypeSegmentSelected
{
    _selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];

    if (_selectedDisplayTypeIndex == 0) {
        NSLog(@"Single file item view selected");
        [_collectionView setCollectionViewLayout:_flowLayout2 animated:YES];
        [_collectionView reloadItemsAtIndexPaths:[_collectionView indexPathsForVisibleItems]];


    } else if (_selectedDisplayTypeIndex == 1) {
        NSLog(@"Grid style view selected");
        [_collectionView setCollectionViewLayout:_flowLayout animated:YES];
        [_collectionView reloadItemsAtIndexPaths:[_collectionView indexPathsForVisibleItems]];
    }

}

在我的cellForItemAtIndexPath中,根据屏幕上显示的布局,我加载了具有正确设置的特定自定义单元格。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{

        NSLog(@"collectionview 1 loaded");

        static NSString *CellIdentifier = @"Cell";
        VAGGarmentCell *cell = [_collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];
        static NSString *CellIdentifier2 = @"Cell2";
        VAGGarmentCell2 *cell2 = [_collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier2 forIndexPath:indexPath];


    if ([[_collectionView collectionViewLayout] isEqual: _flowLayout]) {
        [[cell activityIndicator] startAnimating];

        PFFile *userImageFile = [object valueForKey:@"image"];
        [[cell imageView] setFile: userImageFile];
        [[cell imageView] loadInBackground];

        [[cell activityIndicator] stopAnimating];

        [[cell title] setText:[object valueForKey:@"title"]];
        [[cell price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
        return cell;

    } else if ([[_collectionView collectionViewLayout] isEqual: _flowLayout2]) {
        [[cell2 activityIndicator] startAnimating];

        PFFile *userImageFile = [object valueForKey:@"image"];
        [[cell2 imageView] setFile: userImageFile];
        [[cell2 imageView] loadInBackground];

        [[cell2 activityIndicator] stopAnimating];

        [[cell2 title] setText:[object valueForKey:@"title"]];
        [[cell2 price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
        return cell2;
    }

     return 0;

    //_addToFavouritesButton = [cell addFavouriteButton];

    [_addToFavouritesButton addTarget:_thisController action:@selector(addToFavouritesButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
}

在我的viewDidLoad中,我引用单个项目显示的自定义单元格的nib文件。

// Grab cell nib file and give a reuse identifier
[_collectionView registerNib:[UINib nibWithNibName:@"VAGGarmentCell2" bundle:nil] forCellWithReuseIdentifier:@"Cell2"];

我遇到了崩溃,但他们很难复制,尽管每次我在不同的布局之间切换时,我的记忆力会上升和上升。我猜测我需要删除一些旧代码。我明天就把它弄清楚,然后用仪器检查一下。然而,这已经完成,我可以继续前进。

我可能需要重构我重复的代码。

答案 1 :(得分:2)

我在collectionView显示的切换动画中遇到了一些问题。你的解决方案对我有帮助。

这是我的结果。

enter image description here

这是解决方案

在ViewController中切换操作

            if self.displayType == .grid {
                self.displayType = .table
            }else {
               self.displayType = .grid
            }

            // Only update item size here
            self.updateFlowLayout()

            self.collectionView.performBatchUpdates({

                self.collectionView.setCollectionViewLayout(self.flowLayout, animated: true)

            }, completion: { (finished) in

            })

我正在使用一个collectionViewCell。 覆盖单元格的layoutSubviews

override func layoutSubviews() {
    super.layoutSubviews()
    if (self.bounds.width / self.bounds.height) > 1.4 {
        if self.displayType != .table {
            self.displayType = .table
        }
    }else {

        if self.displayType != .grid {
            self.displayType = .grid
        }
    }
}

并在displayType

var displayType : CastDisplayType = .grid {
        didSet {
            //Update constraints of subviews between cell
            updateLayout()
        }
    }

希望它对某些人有所帮助。