在 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 不根据内容调整大小

如何动态调整 UITableViewCell 内的两个文本标签宽度?

UITableViewCell 无法根据它包含的动态 CollectionView 调整高度

UITableViewCell 不使用 Swift 动态调整大小