Objective-c – IOS UICollectionview动态更改单元格的高度

我正在开展基于收藏视图的项目,根据用户点击特定索引,Numberofitem将被更改并增加. all在我的项目中完美工作,但是我无法根据collection-view中的单元格数设置单元格大小.此外,collectionview将无法通过调整大小来查看所有单元格修复.
这里我附上了所有的形象.

1)故事板视图

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;
}

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

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

解决方法

据我所知,你想复制 this测试的布局.

您需要更好地了解UICollectionView的工作原理,如here

您将必须更改此代理方法中的UICollectionView中的项目数量

- (NSInteger)numberOfItemsInSection:(NSInteger)section;

在这里,你想在测试开始时返回4,然后是4 * 2,4 * 2 * 2,依此类推.这将给你正确的项目数量.

然后布局.您应该有多个值,因为您不需要元素之间的距离与开始和结束相同的空间.随着物品数量增加,我会去减少空间.

您需要注意间距,因为它可能导致单元格被强制在下一行

你已经做了很好的工作,通过划分框架获得最大的高度&细胞的宽度,但你的

- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
  sizeforItemAtIndexPath:(NSIndexPath *)indexPath

方法真的很杂乱

由于您的UICollectionView中不会有无限数量的项目,因此您可以使用switch语句,并在每个开关中返回单元格的计算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;
        }

您应该注意,这里显示的计算出的CGSize必须包含项之间的间距/合并

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

最后,如果你不想UICollectionView是可滚动的,只需设置属性self.collectionView.scrollEnabled = NO;

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...