在UITableCell显示之前未设置UIFont大小 - 如何干净地计算高度

时间:2012-05-18 07:38:15

标签: iphone ios ipad uitableview

次要任务 - 寻找一种干净的方式,以合理的通用方式动态设置表的大小(下面的片段来自http://pastebin.com/E2pUFRg4)。

现在我想像

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *text = [items objectAtIndex:[indexPath row]];

CGSize constraint = CGSizeMake(self.view.bounds.size.width-24.f, CGFLOAT_MAX);

UITableViewCell * cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

CGSize size = [text sizeWithFont:cell.textLabel.font 
               constrainedToSize:constraint 
                   lineBreakMode:UILineBreakModeWordWrap];

CGFloat height = MAX(size.height + 12.f, tableView.rowHeight);

return height;
}

很好地削减它。但不幸的是,在第一次调用tableView时:heightForRowAtIndexPath:textlabel上字体的大小设置为0(否则设置字体本身)。在第一次抽奖之后,它只会变得合情合理。

所以我发现自己必须将其更改为:

....
UIFont * font = cell.textLabel.font;

if (font.pointSize == 0)
    font = [UIFont systemFontOfSize:20];

CGSize size = [text sizeWithFont:font
               constrainedToSize:constraint 
                   lineBreakMode:UILineBreakModeWordWrap];
.....

这就是诀窍。但现在我们突然有一个硬编码的字体大小假设为20.哪种情况很糟糕。

所以现在我的问题是

  • 有什么方法可以阻止这种情况吗?即硬编码这么多?

我还猜测X和Y边界/插入2x6垂直和2x12水平。

  • 有没有办法动态学习或从常量学习(以使其接近iPhone和iPad-UIPopover视图上的正确默认值)?

最后:

  • 建议采用更简洁的方法 - 这也允许将detailLabel或类似的额外字段考虑在内。

http://pastebin.com/E2pUFRg4完成示例。

谢谢,

DW传递。

1 个答案:

答案 0 :(得分:0)

我认为无论如何你需要或多或少地“硬编码”你的字体大小。如果从界面构建器或中心常量文件(甚至代码中)获取它,它总是以某种方式硬编码。

如果您需要区分设备类型(iPhone,iPad)等,您仍然可以根据UI要求使用不同的值。

我通常会为这样的值设置一个中央配置文件。在那里,您还可以“硬编码”您的标准边距值,以及其他单元格标签的字体大小。通常的做法是尽可能动态地计算多少值以减少常量的数量,但仍然需要使用常量来“锚定”这些值。