如何使自定义绘制的UITableViewCell正确调整大小?

时间:2008-10-19 02:13:04

标签: iphone

出于性能原因,我在自定义视图中绘制UITableViewCell的字符串,该视图覆盖其drawRect方法,使用NSString:drawInRect直接在视图矩形中绘制字符串。这类似于Apple的TableViewSuite示例5-CustomTableViewCell。

但是,当我在单元格上调用setEditing以显示删除按钮时,视图在动画完成后以挤压外观结束。为了演示这一点,请在上面提到的CustomTableViewCell示例上调用setEditing:YES并观察失真。有什么方法可以解决这个问题,还是应该恢复使用UILabel作为我的文本?

4 个答案:

答案 0 :(得分:5)

我在UITableViewCell中遇到了与UIView类似的问题。我通过将UIView的contentMode更改为UIViewContentModeLeft来解决它。 (我用屏幕截图写了here。)

答案 1 :(得分:2)

我也有这个问题,在我的情况下,我通过处理drawRect方法中的2个状态来修复它,一个是编辑,另一个是不编辑。换句话说,我考虑了删除按钮的大小,并让我的UI以不同方式重新绘制单元格。我不确定这是否是最有效的方法,但这里是我用来强制重绘的代码:

-(void)_refreshTableAndCells{
    //refresh the table
    [myCustomTableView reloadData];
    //refresh all the visible cells
    for (UITableViewCell *cell in myCustomTableView.visibleCells){
        LocationCellView *locationCell = [cell.contentView.subviews objectAtIndex:0];
        [locationCell setNeedsDisplay];
    }

}

我是一个Objective-C n00b,所以我很高兴有人建议比这更好的方法。

答案 2 :(得分:1)

我通常只是在编辑时修改我想要的不同的x和宽度值(或其他任何值)。开始编辑时UITableView会自动调用layoutSubviews,因此您无需循环访问单元格并自行完成。

- (void)layoutSubviews {
    [super layoutSubviews];

    CGFloat editingPadding = 5.0;
    self.textLabel = CGRectMake((self.editing ? self.textLabel.frame.origin.x + editingPadding : self.textLabel.frame.origin.x), self.textLabel.origin.y, (self.editing ? self.textLabel.frame.size.width - editingPadding : self.textLabel.frame.size.width), self.textLabel.frame.size.height);
}

答案 3 :(得分:0)

尝试将您自己的自定义视图(位于单元格的contentView内)的contentMode设置为UIViewContentModeLeft。 “挤压”是由于默认contentMode为UIViewContentModeScaleToFill