在 UITableViewCell 中动态调整 UILabel?
Posted
技术标签:
【中文标题】在 UITableViewCell 中动态调整 UILabel?【英文标题】:Adjust UILabel Dynamically Within UITableViewCell? 【发布时间】:2018-02-26 05:32:35 【问题描述】:我想动态调整 UILabel 中的行数。例如,可能存在长字符串或短字符串。如果少于 10 个字符,则应为 1 行。如果有 10-20 个字符,应该是两行。此 UILabel 位于 UITableViewCell 内。目前,如果有一个长字符串,那么 UILabel 只会在空间不足的地方显示“...”,因此字符串被切断。我怎样才能防止这种情况发生?
【问题讨论】:
Adjust UILabel height depending on the text的可能重复 【参考方案1】:试试:
nameOfLabel.numberOfLines = 0
0 应该是动态的。
【讨论】:
出于某种原因,这样做对输出没有影响! 你设置了约束吗? 另外,你有一个单元格的自定义类吗?您也许可以覆盖prepareForReuse()
函数以将该属性设置为标签。
如果我有一个用于将标签声明为变量的单元格的自定义类,需要去那里做什么?
上面贴的是我会做的。【参考方案2】:
label 和 label.numberOfLine = 0 的 Top Left Right Button 的约束使其根据动态内容动态调整大小。
【讨论】:
我如何实际添加上图中显示的约束?我以前从未这样做过。 只需添加正常的左右上下约束,使其可以拉伸。【参考方案3】:首先将 Storyboard 中的 UILabel 的 numberOfLines 设置为 0
比为你的 UITableView 设置估计高度
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 108.0
比添加 heightForRowAt 方法
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return UITableViewAutomaticDimension
希望对您有所帮助!
【讨论】:
它仍然没有多行标签,即使它应该有! 您必须从情节提要中为 UILabel 在顶部、底部、左侧和右侧设置约束才能使其正常工作。 查看link 了解如何设置约束。【参考方案4】: 分配和实现 tableview 数据源和委托 将UITableViewAutomaticDimension
分配给rowHeight 和estimatedRowHeight
实现委托/数据源方法(即heightForRowAt
并向其返回值UITableViewAutomaticDimension
)
-
目标 C:
// in ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property IBOutlet UITableView * table;
@end
// in ViewController.m
- (void)viewDidLoad
[super viewDidLoad];
self.table.dataSource = self;
self.table.delegate = self;
self.table.rowHeight = UITableViewAutomaticDimension;
self.table.estimatedRowHeight = UITableViewAutomaticDimension;
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
return UITableViewAutomaticDimension;
斯威夫特:
@IBOutlet weak var table: UITableView!
override func viewDidLoad()
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return UITableViewAutomaticDimension
对于 UITableviewCell 中的标签实例
设置行数=0(&换行模式=截尾) 设置与其父视图/单元格容器相关的所有约束(顶部、底部、左右)。 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。注意:如果您有多个标签(UIElements)具有动态长度,应根据其内容大小进行调整:为您的标签调整'Content Hugging and Compression Resistance Priority'想要以更高的优先级展开/压缩。
【讨论】:
仅供参考:设置self.table.estimatedRowHeight = UITableViewAutomaticDimension;
时,您不需要实现heightForRowAt
方法。
@MahendraGP - 是的,你是对的,我添加了所有可能的选项来帮助实现他/她想要的结果。谢谢你的评论,.. 它会向 OP 发出一个通知,他/她在设计他/她的单元格和标签时应该考虑什么。
您的回复很有帮助。我如何实际添加底部图像中显示的约束?我以前从未这样做过。【参考方案5】:
您需要对 tableview 单元格的标签前导、尾随、顶部和底部进行约束,如下所示...
还将标签的行数设置为零,换行模式为自动换行。
然后在您的主视图控制器中添加这一行...
self.tableView.estimatedRowHeight = UITableViewAutomaticDimension
以上行根据内容自动计算单元格高度。
【讨论】:
以上是关于在 UITableViewCell 中动态调整 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章
在具有自动布局的 UITableViewCell 中动态调整大小的 UIWebView - 违反约束
在 UITableViewCell 中调整 UIImageView 的大小,动态使用 textlabel
如何动态调整 UITableViewCell 内的两个文本标签宽度?