自定义 UITableViewCell 的样式看起来非常像 UITableViewCellStyleValue2

Posted

技术标签:

【中文标题】自定义 UITableViewCell 的样式看起来非常像 UITableViewCellStyleValue2【英文标题】:Custom UITableViewCell that has a style looking very much like UITableViewCellStyleValue2 【发布时间】:2011-11-24 11:05:34 【问题描述】:

我想创建一个 UITableViewCell,左边有两个蓝色文本“TextLabels”,右边有两个黑色“DetailTextLabels”,样式尽可能与 UITableViewCellStyleValue2 相似。

到目前为止,我已将 TextLabel 和 DetailTextLabel 文本设置为非常长的内容(这样它将占据分配给蓝色标签的全部宽度),将字体设置为 UIColor.Clear,然后然后在每次渲染时进行测量。出于很多原因,这很可怕,但它以某种方式起作用。

我想使用自定义 UIView 和自定义 Draw 方法来完成此操作。这是一个更漂亮的解决方案,但现在我错过了一条重要的信息:用于显示 TextLabel 的区域的宽度。我可以对其进行硬编码,这似乎是在 ios 上做事的公认方式(即使它让我觉得很脏),但是我必须在水平和垂直方向上为 iPad 和 iPhone 硬编码。然后它可能会在我的 UITableView 是普通的而不是分组的或类似的东西时中断。

我在哪里可以得到这个愚蠢标签区域的标准当前宽度?

谢谢!

【问题讨论】:

你试过 cell.frame.size.width 吗? @AlanZeino 这会给我单元格的宽度,而不是分配给蓝色标签的区域的宽度。 我认为您可能正在倒退 - 您想要的是单元格左右边缘的标准插图,硬编码这些并将您的标签设置为自动大小(灵活宽度),这将覆盖你的肖像、风景、iPad 等。我不确定你为什么要使用自定义视图并手动绘制而不是添加标签作为子视图? @2ndMessage: 是的,但是您可以定义比例,其中单元格的区域将用于蓝色和黑色标签(例如单元格宽度的 2/3 用于蓝色;1 /3 - 用于绿色标签)。无论如何,宽度的计算取决于您。 该单元格必须适合所有其他正常的 UITableViewCell(左 TextLabel 字体、宽度等),并且看起来像是来自苹果自己。同意,我可以将其设置为单元格的 1/3 宽度,或者距离右侧圆角左侧 10 像素或其他任何值,但文本不会与正常的粗体蓝色样式标签完美对齐显示在标准 UITableViewCellStyleValue2 样式的单元格中。我需要将它定义为与苹果神所做的完全相同的宽度。如果我不这样做,它会看起来很便宜而且不合适。肯定有一些我可以刺激的 const 或 rectangle 属性吗? 【参考方案1】:

每个UITableViewCell 都有一个textLabel 和一个detailTextLabel。在UITableViewCellStyleValue2 上,textLabel 位于左侧,detailTextLabel 位于右侧。因此,您可以像这样访问左侧标签的区域:

cell.textLabel.frame

您可以像这样访问正确的标签区域:

cell.detailTextLabel.frame

【讨论】:

没错,但根据内容,它们具有不同的宽度。我希望有一个常数或一个您可以查询的属性,而不必在提供的文本标签中设置虚假内容、隐藏它们等。我已经掌握了这种方法,但是我认为有一种更简洁的方法可以查询简单控件的简单属性。【参考方案2】:

您是否考虑过在 Interface Builder 中制作单元格并使用静态 UINib 来加载它?这对我来说似乎足够快,但我还没有测试过比 3GS 更慢的东西。

如果它对您的应用程序来说足够快,我强烈推荐它,您将能够在未来以更少的努力进行小的(和大的!)调整。

【讨论】:

【参考方案3】:

只需将UIView 子类化,然后在您的drawRect 中执行以下操作。

- (void) drawRect:(CGRect)rect 
    NSString *label = @"Label 1";
    CGSize size = [label sizeWithFont:[UIFont boldSystemFontOfSize:12.0f] 
                   constrainedToSize:CGSizeMake(self.frame.size.width, 100.0f) 
                   lineBreakMode:UILineBreakModeCharacterWrap];

    [label drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height) withFont:[UIFont boldSystemFontOfSize:12.0f]];

    [super drawRect:rect];

【讨论】:

以上是关于自定义 UITableViewCell 的样式看起来非常像 UITableViewCellStyleValue2的主要内容,如果未能解决你的问题,请参考以下文章

在普通样式的 UITableView 中更改自定义 UITableViewCell 单元格的背景颜色

样式化的 UITableViewCell(试图复制 Facebook iPhone App Look)[重复]

错误:无法使用自定义单元格类设置 UITableViewCell 标签和图像!只能加载单元格样式的数据:字幕不是自定义的

来自 NIB 的可扩展自定义 UITableViewCell

创建自定义 UITableViewCell

iOS自定义表格视图的行选择样式?