自定义 UITableViewCell 中标签的自动布局优先级

Posted

技术标签:

【中文标题】自定义 UITableViewCell 中标签的自动布局优先级【英文标题】:Autolayout priorities for labels in custom UITableViewCell 【发布时间】:2015-04-01 09:59:34 【问题描述】:

我设计了如下的自定义单元格。

它将显示动态内容。我在为这些标签的顶部空间、底部空间、垂直拥抱优先级、垂直阻力优先级分配自动布局约束优先级并将行数设置为零和换行模式自动换行时遇到问题。 我试过了,但有些标签被剪掉了,如下图所示:

任何帮助设置标签的自动布局约束优先级将不胜感激..

label1的约束如附图所示

label2 的约束如附图中所示

string=@"我的名字是........我的名字是........我的名字是";

行高:

static AttendeesListViewCell *sizingCell = nil;
static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^
    sizingCell = [self.attendeess_TableView dequeueReusableCellWithIdentifier:cellIdentifierAttendessWithImage];

);

sizingCell.attendessNameLabel.text = string;
        sizingCell.attendessTitleLabel.text = string;

 sizingCell.attendessCompanyLabel.text = string;
 sizingCell.label_city.text=string;
sizingCell.label_country.text=string;

[sizingCell setNeedsLayout]; [sizingCell layoutIfNeeded]; CGSize size = [sizingCell .contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

return size.height;

在行的单元格中:

参加者列表视图单元 *cell_attendee; cell_attendee = [tableView dequeueReusableCellWithIdentifier:cellIdentifierAttendessWithImage]; cell_attendee.attendessNameLabel.text = 字符串; cell_attendee.attendessTitleLabel.text = string;

cell_attendee.attendessCompanyLabel.text = string; 
cell_attendee.label_city.text=string;
cell_attendee.label_country.text=string;
 return cell_attendee;

谢谢。

【问题讨论】:

【参考方案1】:

您可能会发现需要设置以下属性。我发现我必须这样做才能让自动换行在单元格中的多行 UILabel 中正常工作。

preferredMaxLayoutWidth

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UILabel_Class/index.html#//apple_ref/occ/instp/UILabel/preferredMaxLayoutWidth

您可以在 UILabel 顶部的约束检查器窗口中设置此项。

【讨论】:

我已经设置了preferredMaxLayoutWidth 属性,但是没有运气。 奇怪,因为它看起来像您的 UILabel 正在包装文本,但无法根据包装的位置显示整个字符串,因此截断了中间部分。在 iOS8 中,您希望将 preferredMaxLayoutWidth 设置为自动。对于 iOS7,我认为它必须是明确的大小。从你的照片我猜这需要在220pts左右?我也遇到了表格中的自动布局问题,发现在viewDidAppear 中做一个额外的[self.tableView reloadData]; 可以解决一些问题。 刚刚看到你的更新。在您的行高中,您可能还需要设置单元格的宽度,因为 iOS8 中存在与使用 dequeueReusableCellWithIdentifier 进行原型相关的问题。与dequeueReusableCellWithIdentifier:forIndexPath 返回的单元格不同,返回的单元格不是表格的一部分。检查单元格 contentView 的边界宽度在返回的原型单元格上是多少。您可能会发现它的宽度太宽,这会影响您的布局。 谢谢。我面临的另一个问题是假设第四个标签没有文本,那么我应该将那个特定标签的顶部空间和底部空间设置为零吗? 我认为默认情况下 UILabel 的高度为 1 行。我刚刚尝试了以下方法,它似乎有效。为每个标签添加一个将高度设置为 >=0 的约束。当没有文本时,它会折叠到 0 高度。当有文本时,它将增长到文本的高度。试一试,看看它是否适合你。【参考方案2】:

我不确定为什么它不起作用...

从代码和 xib 文件中设置标签的行数。

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

设置: 1.基线作为对齐基线, 2. Auto Shrink 固定字体大小。

如果您分享应用于标签和代码 sn-p 的自动布局约束,我可以提供准确的解决方案。

检查这是否是您所期望的link

【讨论】:

是的,我将基线设置为对齐基线和自动收缩固定字体大小。 我附上了 label1 约束的图片。顶部空间和底部空间约束优先级为 1000。 嘿,请检查这个项目..看看这是否是你所期望的..link

以上是关于自定义 UITableViewCell 中标签的自动布局优先级的主要内容,如果未能解决你的问题,请参考以下文章

具有自动布局的tableView中标签的高度问题

更改自定义 UICollectionCell 中标签的边框宽度

滚动时 Tableview 单元格中标签的自动收缩功能不起作用

无法根据objective-c中标签的文本大小设置单元格大小

如何提取html中标签的属性值

在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView