3

我想动态调整 UITableViewCell 内的 UIImage 的宽度,我正在使用情节提要来设计 UITableViewCell,我只是添加了一个标签和一个图像,属性得到正确更新,我什至加载了标签中的宽度以显示它是正确的值,对于图像,我正在加载我想重复的背景图像,但图像最初不会更新宽度,如果我上下滚动,图像按预期显示,这是 cellForRowAtIndexPath 的代码,我也尝试将代码放在 willDisplayCell 方法上,结果相同

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mycustomcell"];
    int r = [[data objectAtIndex:indexPath.row] intValue];
    UIImageView *img = (UIImageView *)[cell viewWithTag:2];
    img.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"some_img" ofType:@"png"]]];
    CGRect frame = img.frame;
    frame.size.width = r*16;
    img.frame = frame;

    int n = img.frame.size.width;
    UILabel *label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"custom %d", n];
    [cell setNeedsDisplay];
    return cell;
}

我只想让它在滚动后开始工作,想法?

4

2 回答 2

7

表格视图单元格内容的动态调整大小是一个众所周知的问题。虽然有一些笨拙的解决方法,但我相信正确的解决方案取决于您是否使用自动布局:

  • 如果使用自动布局,请确保您的单元格的图像视图具有宽度约束,然后您可以更改约束constant

    for (NSLayoutConstraint *constraint in img.constraints)
    {
        if (constraint.firstAttribute == NSLayoutAttributeWidth)
            constraint.constant = r*16;
    }
    

    坦率地说,我宁愿使用自定义UITableViewCell子类并有一个IBOutlet宽度约束(例如imageWidthConstraint),它使您不必枚举约束以找到正确的约束,您可以简单地:

    cell.imageWidthConstraint.constant = r*16;
    
  • 如果不使用自动布局,您应该子类化UITableViewCell,将其用作单元原型的基类,然后覆盖layoutSubviews,并在那里调整图像视图的大小。请参阅更改 UITableViewCell 的 imageView 的边界

无论您采用哪种方法,使用UITableViewCell子类都无需使用viewForTag构造,这使得视图控制器代码更加直观。

于 2013-10-13T22:18:06.067 回答
1

啊,删除自动布局解决了问题

于 2013-10-14T05:31:21.020 回答