无法在具有动态高度的子类UITableViewCell中调整UIImageView的帧大小

时间:2014-02-06 19:23:37

标签: ios iphone uitableview uiimageview

在我的UITableView中,所有单元格都是不同的高度。所有这些都有背景图像,这是一个泡影图片。所有单元格的TextLabels也需要不同的宽度,所以我已经将UITableViewCell子类化,并赋予它两个属性:

@property (strong, nonatomic) UILabel* messageTextLabel;
@property (strong, nonatomic) UIImageView* bubbleImageView;

我的自定义UITableViewCell的initWithStyle设置如下:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {

    //stretchable bubble image
    UIImage *rawBackground = [UIImage imageNamed:@"text_bubble"];
    UIImage *background = [rawBackground stretchableImageWithLeftCapWidth:13 topCapHeight:22];
    _bubbleImageView = [[UIImageView alloc] initWithImage:background];

     //textlabel
    _messageTextLabel = [[UILabel alloc] init];
    [_messageTextLabel setFont:[UIFont systemFontOfSize:14.0f]];
    [_messageTextLabel setNumberOfLines:0];
    [_messageTextLabel setBackgroundColor:[UIColor clearColor]];
    [_messageTextLabel setTextColor:[UIColor blackColor]];

    [self.contentView addSubview:_bubbleImageView];
    [self.contentView addSubview:_messageTextLabel];

}
    return self;
}

在我的TableView的cellForRowAtIndexPath中,我已经尝试在那里分配一个UIImageView并将其设置为单元格的框架,这样可行,但是当我向上和向下滚动时,屏幕就会显示一遍又一遍地重新分配UIImageViews而变得混乱。我尝试了if(cell == nil)技术,但这只会使我的整个UITableView成为空白。所以,这就是我现在所拥有的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    Cell *cell = (Cell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //works just fine
    [cell.messageTextLabel setFrame:CGRectMake(15, 0, 245, cell.frame.size.height -10)];

    //this doesn't work at all
    [cell.bubbleImageView setFrame:CGRectMake(10, 0, cell.frame.size.width, cell.frame.size.height)];

    [cell.messageTextLabel setText:[self.randomData objectAtIndex:indexPath.item]];

    return cell;
}

所以我的UITableView在运行时看起来像这样(选中单元格以便您可以看到框架):

请注意,我可以在bubbleImageView子类中设置UITableViewCell的帧,但我不知道该单元格的高度是多少。我更加困惑的是,我可以设置messageTextLabel的框架,而不是我的bubbleImageViews。我可能正在做一些非常基本的错误,这是一个简单的问题,虽然由于某些原因我被绊倒了。

谢谢!

1 个答案:

答案 0 :(得分:1)

我在这里看到了两个问题:

  • 我认为您已启用自动布局 在这种情况下,初始框架和autoresizingMask会自动转换为自动布局约束 在此之后,没有帧更改将改变视图的大小和位置 - 只有约束...
  • 您尚未将图片视图的contentMode设置为UIViewContentModeScaleToFill(这是默认设置,但无论如何最好定义此类属性)。
    只需在启动后立即添加此行:_bubbleImageView.contentMode = UIViewContentModeScaleToFill;

我认为这里的解决方案是自动布局 - 正确设置约束将解决这个问题 我建议在故事板中使用表视图控制器和动态单元格进行...