IOS UICollectionview动态更改Cell的高度

Bad*_*hah 10 objective-c uicollectionview ios7

我正在开发基于集合视图的项目,根据用户点击特定索引,将更改Numberofitem并增加其数量.所有在我的项目中完美运行,但我无法根据集合视图中的单元格数设置单元格大小.更多集合视图将无法滚动所有单元格修复视图中的调整大小.在这里,我附上了所有图像.

1)故事板视图

StoryboardView

2)四个细胞的结果

结果有四个细胞

3)当细胞数量增加时

当细胞数量增加时

目前我通过以下代码以这种方式完成了我的单元格设置.但我想设置一下,如果集合视图中有四个单元格,那么每个单元格的大小会根据集合视图和设备大小增加和拟合(iphone 5s,iphone 6,iphone 6plus)

这是我的尝试,

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 5.0;
}
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
    return 5.0;
}
- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
        ////@property NSInteger count;////
 if (_count == 0)  {
    //  width = ((width - (span*5))/4);
    //        return CGSizeMake(self.view.frame.size.width/4,  self.view.frame.size.height/4);
    return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5);
}
if (_count == 1 || _count == 2)
{
    return CGSizeMake(self.view.frame.size.width/2.5, self.view.frame.size.height/5);
    // return CGSizeMake(100.0, 100.0);
}
if (  _count == 3 || _count == 4 || _count == 5)
{
    // return CGSizeMake(100.0, 100.0);
    return CGSizeMake(self.view.frame.size.width/3.5, self.view.frame.size.height/6.5);
}
if (  _count == 6 || _count == 7 || _count == 8 || _count == 9)
{
    //return CGSizeMake(90.0, 90.0);
    return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8);
}
if (  _count == 10 || _count == 11 || _count == 12 || _count == 13 || _count == 14)
{
    //  return CGSizeMake(80.0, 80.0);
    return CGSizeMake(self.view.frame.size.width/4, self.view.frame.size.height/8);
}
if (  _count == 15 || _count == 16 || _count == 17 || _count == 18 || _count == 19 || _count ==20)
{
    //return CGSizeMake(70.0, 70.0);
    return CGSizeMake(self.view.frame.size.width/4.75, self.view.frame.size.height/9.5);
}
if (_count ==21 || _count == 22 || _count == 23 || _count == 24 || _count == 25 || _count == 26 || _count == 27) {
    // return CGSizeMake(60.0, 60.0);
    return CGSizeMake(self.view.frame.size.width/6, self.view.frame.size.height/12);
}
if (_count ==28 || _count == 29  ) {
    //  return CGSizeMake(50.0, 50.0);
    return CGSizeMake(self.view.frame.size.width/6.25, self.view.frame.size.height/12.5);
}
else
    return CGSizeMake(0, 0);
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return itemincollectionview.count;
}
Run Code Online (Sandbox Code Playgroud)

注意: - 我也试过这个方法.

  - (void)viewDidLayoutSubviews
  {
    self.automaticallyAdjustsScrollViewInsets = NO;
    [self.collectionView layoutIfNeeded];
    NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
    NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
    NSIndexPath *nextItem = [NSIndexPath indexPathForItem:_setRandomIndex inSection:currentItem.section];

    [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
 }

 - (void)viewWillLayoutSubviews
 {
    [super viewWillLayoutSubviews];
    [self.collectionView.collectionViewLayout invalidateLayout];
 }

 -(void)viewWillAppear:(BOOL)animated
 {
     [super viewWillAppear:YES];
     [self.view layoutIfNeeded];
 }
Run Code Online (Sandbox Code Playgroud)

Loe*_*gic 0

据我了解,您想要复制测试的布局。

你需要更好地理解这里UICollectionView是如何工作的

您必须更改此委托方法中的项目数:UICollectionView

- (NSInteger)numberOfItemsInSection:(NSInteger)section;
Run Code Online (Sandbox Code Playgroud)

在这里,您希望在测试开始时返回 4,然后返回 4*2、4*2*2,依此类推。这将为您提供正确的物品数量。

然后是布局。您应该为其设置多个值,因为您不希望元素之间的间距与开头和结尾相同。随着物品数量的增加,我会减少空间。

您需要小心间距,因为它可能会导致单元格被迫位于下一行

通过划分框架以获得单元格的最大高度和宽度,您已经做得很好,但是您的

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

方法确实很乱。

由于您的 中不会有无限数量的项目UICollectionView,因此您可以使用switch statement,并且在每个开关中返回CGSize单元格的计算值。

例如,您可以这样使用它:

    switch (numberOfHorizontalItems) {
      case 2:
            return CGSizeMake(self.collectionView.frame.size.width/2.5,self.collectionView.frame.size.width/2.5);
                break;

    case 4:
                return CGSizeMake(self.collectionView.frame.size.width/4.5,self.collectionView.frame.size.width/4.5);
                break;
    case 8:
                CGSizeMake(self.collectionView.frame.size.width/8.5,self.collectionView.frame.size.width/8.5);
                break;
(And so on)

      default:
                break;
        }
Run Code Online (Sandbox Code Playgroud)

您应该注意,此处显示的计算结果CGSize必须包含之间的间距/合并items

您也不需要viewWillLayoutSubviewsand ,您只需要在用户点击单元格时viewDidLayoutSubviews调用(或者在用户点击单元格后处理逻辑的方法中)[self.collectionView reloadData]

最后,如果你不希望UICollectionView滚动,只需设置该属性即可self.collectionView.scrollEnabled = NO;