UITableViewCell - 如何使右 UILabel 截断而不是左截断?

Posted

技术标签:

【中文标题】UITableViewCell - 如何使右 UILabel 截断而不是左截断?【英文标题】:UITableViewCell - how to make right UILabel truncate instead of left one? 【发布时间】:2009-11-09 15:05:09 【问题描述】:

我使用 UITableViewCellStyleValue1 创建了一个 UITableViewCell,Apple 文档将其定义为:

单元格左侧带有标签的单元格样式,带有左对齐和黑色文本;右侧是具有较小蓝色文本且右对齐的标签。设置应用程序使用这种样式的单元格。

我正在尝试将单元格文本设置为在左侧显示一些短文本,在右侧显示一些长文本,例如

网址http://www.mylongurl.com/subdirectory/etc

我的问题是左边的 UILabel 被截断而不是右边的,所以它显示为:

你...http://www.mylongurl.com/subdirectory/etc

如果我使 URL 更长,那么两个标签都会被截断,例如

你...http://www.mylongurl.com...subdirectory/etc

有什么方法可以在不使用自定义 UITableViewCell 的情况下使右侧的 UILabel 截断而不是左侧的截断?我知道如何创建一个自定义的 UITableViewCell,但这似乎有点矫枉过正?

我可以设置 UILineBreakMode 来更改文本在 UILabel 中截断的位置,但我看不到让 detailTextLabel 调整其宽度以让 textLabel 自行显示的方法。

[[lCell textLabel] setText:@"URL"];
[[lCell detailTextLabel] setText:@"http://www.mylongurl.com/subdirectory/etc"];
[[lCell detailTextLabel] setLineBreakMode:UILineBreakModeMiddleTruncation];

【问题讨论】:

【参考方案1】:

你有几个选择。

可能与您的要求最接近的精神是在您的UITableViewDelegatetableView:willDisplayCell:forRowAtIndexPath: 中使用标签框。 (在UITableViewDataSourcetableView:cellForRowAtIndexPath: 中进行单元格布局修改将无法进行,因为UITableViewCellstableView:cellForRowAtIndexPath: 之后完成所有自己的内部布局工作。)您可以使用NSString 的-sizeWithFont:帮助找出您的textLabel 的布局要求。

您还可以采用不同的方法,如您所提到的,例如子类化UITableViewCell 或设置cell.textLabel.adjustsFontSizeToFitWidth = YES

【讨论】:

最后我做了一些非常类似于你建议的事情。我设置 UITableViewCell setNumberOfLines:0 ,然后使用 NSString sizeWithFont:constrainedToSize:lineBreakMode 调整 tableView:heightForRowAtIndexPath:indexPath 中 UITableViewCell 的高度以计算适当的高度。令人惊讶的是,没有更简单的方法可以做到这一点! 是的;我花了很多时间编写表格视图单元格。不过,在通用布局系统和性能之间需要权衡取舍,而且 UITableViewCells 是资源受限设备上的性能热点,所以我理解在某种程度上保持 API/支持矩阵简单。【参考方案2】:

最好的解决方案是创建 UITableView 单元格的子类,并将您的自定义设置为标签,就像您在 init 中一样。如果您希望左边的标签更宽,您可能需要覆盖 layoutSubviews 并调整标签大小。

- (void)layoutSubviews 
    [super layoutSubviews];
    self.textLabel.frame = CGRectMake(0.0, 0.0, 100.0, self.frame.size.height);
    self.detailTextLabel.frame = CGRectMake(0.0, 0.0, 220.0, self.frame.size.height);

显然,这些是任意值。你会想玩不同的尺寸来满足你的需求。

【讨论】:

感谢您的回复,但我确实明确表示我知道如何将 UITableViewCell 子类化,但我希望有一个更简单的解决方案! Dan,子类化一点也不复杂。我建议子类化。在 cellForRow 方法中设置所有选项比在子类中进行自定义要慢得多。

以上是关于UITableViewCell - 如何使右 UILabel 截断而不是左截断?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UI篇—UITableviewcell的性能问题

iOS开发UI篇—UITableviewcell的性能优化和缓存机制

UITableViewCell 背景隐藏 UI 元素

在 UITableViewCell 中添加 UICollectionView 后 UI 突然发生变化

如何在 swift 中创建新闻提要 UI

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局