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】:你有几个选择。
可能与您的要求最接近的精神是在您的UITableViewDelegate
的tableView:willDisplayCell:forRowAtIndexPath:
中使用标签框。 (在UITableViewDataSource
的tableView:cellForRowAtIndexPath:
中进行单元格布局修改将无法进行,因为UITableViewCells
在tableView: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的性能优化和缓存机制