0

次要任务 - 寻找一种干净的方式以合理通用的方式动态设置表格的大小(下面的片段来自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上完成示例。

谢谢,

德。

4

1 回答 1

0

我认为无论如何你都需要或多或少地“硬编码”你的字体大小。如果您从界面生成器或中央常量文件中获取它 - 甚至在代码中 - 它总是以某种方式硬编码。

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

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

于 2012-05-18T09:26:14.397 回答