动态集合视图单元格大小目标c?

Posted

技术标签:

【中文标题】动态集合视图单元格大小目标c?【英文标题】:Dynamic collection view cell size-objective c? 【发布时间】:2018-02-22 12:34:50 【问题描述】:

我正在处理目标 c 中的集合视图,

我的问题是

1.我想根据内容大小改变单元格大小 2.如果单元格中没有图片,那么喜欢和评论视图​​应该放在上面(参考图片)。

我已经改变了类似的约束

 NSLayoutConstraint *newConstraint;

 if([image isEqualToString:@"no_image.jpg"] || [image isEqualToString:@"no_image.jpg"])

    cell.desc_ImgViewWidth.constant = 0;

    [cell.Descimgview setHidden:YES];

    newConstraint = [NSLayoutConstraint constraintWithItem:(cell.bottomConstraint).firstItem attribute:(cell.bottomConstraint).firstAttribute relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:(cell.bottomConstraint).secondItem attribute:(cell.bottomConstraint).secondAttribute multiplier:(cell.bottomConstraint).multiplier constant:(cell.bottomConstraint).constant];


else

    cell.desc_ImgViewWidth.constant = 120;
    [cell.Descimgview setHidden:NO];

    newConstraint = [NSLayoutConstraint constraintWithItem:(cell.bottomConstraint).firstItem attribute:(cell.bottomConstraint).firstAttribute relatedBy:NSLayoutRelationEqual toItem:(cell.bottomConstraint).secondItem attribute:(cell.bottomConstraint).secondAttribute multiplier:(cell.bottomConstraint).multiplier constant:(cell.bottomConstraint).constant];


    [cell.contentView removeConstraint:(cell.bottomConstraint)];
    [cell.contentView addConstraint:newConstraint];

    [cell layoutIfNeeded];
    [[cell contentView] setFrame:[cell bounds]];
    [[cell contentView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

在 cellForItemAtIndexPath 委托方法中。(首先喜欢和评论视图​​在上方移动,但在重新加载单元格后,即如滚动等,约束不能正常工作)

我想像这样移动和评论视图​​,并降低该特定单元格的单元格高度(请参阅下图)

如何正确地做到这一点?

【问题讨论】:

这只是部分截图,但似乎UITableView 应该是更好的选择。否则,你会看到这个:***.com/questions/25895311/…? 使用两个单元格,一个是有图像的,另一个是没有图像的。但是对于自己调整单元格内容的大小,表格视图是最好的选择。 【参考方案1】:

您可以使用UICollectionViewLayout

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 

         if imageView != nil
         
            return CGSizeMake(width, height)
         
         else
         
            return CGSizeMake(width, height)
         
    

【讨论】:

我认为最简单的方法是通过约束。 谢谢@KamleshShinarakhiya,我听从了你的想法。【参考方案2】:

终于这样实现了,

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

       NSDictionary* object = [_Data objectAtIndex:indexPath.item];

       NSString *image = [object valueForKey:@"image"];

       if([image isEqualToString:@"no_image.jpg"] || [image isEqualToString:@"no_image.jpg"])

          CGRect screenRect = [[UIScreen mainScreen] bounds];
          CGFloat screenWidth = screenRect.size.width;
          float cellWidth = screenWidth;

          NSDictionary* object = [_Data objectAtIndex:indexPath.item];


          NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:[SwiftHelper getEmojiText:[object valueForKey:@"description"]]];
    [str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:15.0] range:NSMakeRange(0, str.length)];

          CGSize sizeName = CGRectIntegral([str boundingRectWithSize:CGSizeMake(cellWidth-8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil]).size;

          NSMutableAttributedString *str1 = [[NSMutableAttributedString alloc] initWithString:[SwiftHelper getEmojiText:[object valueForKey:@"name"]]];
    [str1 addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:15.0] range:NSMakeRange(0, str1.length)];

          CGSize sizeName1 = CGRectIntegral([str1 boundingRectWithSize:CGSizeMake(cellWidth-8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil]).size;
          NSLog(@"%f,%f",sizeName.height,sizeName1.height);
         if(sizeName.height > 100)
            sizeName.height = 70;
         
         return CGSizeMake(cellWidth, sizeName.height + sizeName1.height + 110);


     
     else

         CGRect screenRect = [[UIScreen mainScreen] bounds];
         CGFloat screenWidth = screenRect.size.width;
         float cellWidth = screenWidth;

         CGSize size = CGSizeMake(cellWidth, 182);

         return size;
     

感谢各位朋友的建议。

确实最好为此使用 tableview,但不幸的是,在将集合视图用于以前的设计之后,需求发生了这样的变化。所以,我很挣扎。

【讨论】:

以上是关于动态集合视图单元格大小目标c?的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局约束动态调整表格视图单元格的大小

在不同设备上动态设置集合视图单元格大小

动态缩小 UICollectionViewCell 的高度

目标c-关闭集合视图控制器后未释放常驻内存和脏内存

如何在目标 c 中将单元格移动到顶部和右侧

使用自动布局自定义集合视图单元格的动态高度