调整 UITableViewCell 的大小以适合标签或图像和圆角

Posted

技术标签:

【中文标题】调整 UITableViewCell 的大小以适合标签或图像和圆角【英文标题】:Resize UITableViewCell to fit label or image and rounded corners 【发布时间】:2017-03-15 18:02:26 【问题描述】:

我附上了sample project,让您可以测试并查看我能做些什么来解决这个问题。

我正在尝试动态调整高度图像的大小,同时围绕每个其他单元格的两个角。这样做会导致蒙版被切断。

基本上这是我想要实现的目标:

    UITableView 的行高设置为自动。

    _nTableView.rowHeight = UITableViewAutomaticDimension;
    _nTableView.estimatedRowHeight = 150;
    

    使用 SDWebImage 库使用 CustomTableViewCell 下载图像

    [self.nImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)];
    

    将单元格配置为根据其行圆角

    UIBezierPath *maskPath = [UIBezierPath
                          bezierPathWithRoundedRect:self.bubbleView.bounds
                          byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerTopLeft)
                          cornerRadii:CGSizeMake(20, 20)];
    
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    
    maskLayer.frame = self.bubbleView.bounds;
    maskLayer.path = maskPath.CGPath;
    
    self.bubbleView.layer.mask = maskLayer;
    

执行上述操作会导致蒙版切断,但高度计算正确。见下文:

基于这个stack overflow's question,如果有掩码,我们需要移除掩码。我尝试在 awakeFromNib 方法中将掩码设置为 nil,但这没有任何影响。

self.nImageView.layer.mask = nil;
self.nImageView.layer.masksToBounds = NO;

我也尝试按照question 的答案进行操作,但这会导致应用程序崩溃。

提前谢谢你。

【问题讨论】:

你是保持图像的大小是固定的还是可变的? 抓取了您的示例项目...是的,它会崩溃,直到我删除 cellForRowAtIndexPath 中的“删除层”代码...但是,我不知道您要做什么。你这里的图片是你想要的吗?如果不是,它应该是什么样子? @DonMag 我已经更新了项目,删除了“层”代码。如果您评论 [cell configureBubbleInRow:indexPath.row],您将看到我想要看到的内容。看到这个:imgur.com/a/JVtA3 我认为您最好在图像下载后在完成块中设置遮罩(或重新设置遮罩)。稍微快速玩一下,就很接近了 - 至少,假设这是最终目标:d.pr/i/Uz7H @DonMag 我尝试调用 [self configureBubbleInRow:rowIndex] 并没有给我类似的结果。你能告诉我你做了什么吗? 【参考方案1】:

这是一种可能的解决方案 - 可能不是最好的,可能无法完全满足您的需求,但可能会让您顺利上路...

不要尝试从自定义 UITableViewCell 类中操作图层/蒙版,而是使用 UIView 子类作为图像持有者。该类的代码可以处理圆角和图层/蒙版大小更新。

在此处查看示例:https://github.com/DonMag/dhImage

【讨论】:

【参考方案2】:

根据内容设置行高:

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  

    if(/*check if content is text label*/)
    
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
      UILabel *lbl = (UILabel*)[ cell.contentView viewWithTag:1000];  
      lbl.text = message;
      [cell layoutIfNeeded];
      CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

      if(size.height < 100) 
            return  100;
      
      else 
           return size.height;
      
    
    else                  // content is image 
        return 200;
      
    

将单元格配置为圆角:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

  .
  .
  .
    [cell.contentView.layer setCornerRadius:10.0f];
  return cell;

使用 SDWebImage 库下载图像:

      SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
       [downloader downloadImageWithURL:addr 
                                options:0 
                               progress:
                  ^(NSInteger receivedSize, NSInteger expectedSize) 
                        // progression tracking code 
                              
                              completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) 
                      if (image && finished) 
                          // Pass the imageView to this block
                          // After completion display downloaded image in imageView
                          imageView.image = image;
                      
                  ];

希望对你有帮助!!

【讨论】:

希望对您有所帮助!!回复@AndyM 由于删除 cellForRowAtIndexPath 中的图层而导致崩溃,但您也没有提及无缘无故更改变量名称 哪一部分? @僵尸 实际上我有工作代码..我已经粘贴了其中的一部分!! @僵尸。如果您看到任何变化,请通知我.. 会很高兴知道 n 变化:) 在从主线程访问引擎后,此应用程序正在从后台线程修改自动布局引擎。这可能会导致引擎损坏和奇怪的崩溃。

以上是关于调整 UITableViewCell 的大小以适合标签或图像和圆角的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 uiimageview 的大小以仅适合 aspectfill 中的图像?

如何调整 UITableViewCell 的大小以适应其内容?

下载图像时 UITableViewCell 高度调整大小

调整大小后 UITableViewCell 中的 UIImageView 分辨率低

以 Right Detail 样式 UITableViewCell 调整 UIImageView 的大小

调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何