动态集合视图单元格大小目标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?的主要内容,如果未能解决你的问题,请参考以下文章