UILabel 不能可靠地包装
Posted
技术标签:
【中文标题】UILabel 不能可靠地包装【英文标题】:UILabel not wrapping reliably 【发布时间】:2015-06-18 13:04:28 【问题描述】:似乎不可能让 UILabel 以我希望它始终的方式遵守约束。前导和尾随空格约束似乎有效,但标签只是截断行而不是扩展到新行。
我确实将UILabel
的numberOfLines
设置为0。我还尝试了此处列出的建议:UILabel not wrapping text correctly sometimes (auto layout),但它似乎无法可靠地工作。我尝试的最后一件事是将setContentCompressionResistancePriority
属性设置为Fitted
和Low
,但它不适用于UITableView
中的所有内容。事实上,根据 tableview 是否刷新,看起来所有的包装都可以撤消。
我尝试过的唯一似乎工作良好的方法是将 UILabel 的 preferredMaxLayoutWidth
设置为常量。我只是希望将它用作最后的手段,以避免计算标签在运行时应该有多宽。当然,有一种开箱即用的方法可以得到我想要的东西。
【问题讨论】:
是否给出了最佳高度?还是在运行时计算高度? 嘿,你有没有提供固定的高度和宽度限制 这取决于UILabel
实例的高度和字体,可能标签始终围绕文本(最终它是一个精确计算的值,只是不是戏剧女王),所以,有可能您的情况在边缘的情况下,高度的微小变化会影响最终结果(自动布局工作浮动而不是整体!),因此,您可能需要稍微更改布局(例如,将高度增加 1 点,或将字体大小减小 5% 等...),以将 UILabel
从这种不平衡的情况中推开。
如果您有一个固定的字体大小并且标签的高度不允许显示两行或多行(太小),您将得到与图片中类似的结果。尝试设置最小字体大小,看看是否有任何区别。
约束只是按照你告诉他们的去做。将抗压性提高到高于UITableViewCell
中的其他项目,并检查您没有其他以更高优先级运行的约束,因此它们优先。这是一个很好的问题,带有示例答案:***.com/q/15850417/558933
【参考方案1】:
您可以根据内容计算UILabel运行时的高度
func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
【讨论】:
这看起来真的很密集,不是吗? @mango 这是我能看到的根据内容计算动态高度的唯一选项。否则,请从情节提要中明确提供最大高度 我在这里没有使用故事板。但是当我有机会时,我会尝试按照您的建议指定最大高度。 设置高度似乎没有任何效果。是不是:label.frame.size.height = 12? @mango 你必须传递“标签文本”,“字体如果你想要”和“标签的宽度”,它会自动返回高度然后你可以创建标签的框架【参考方案2】:使其正常工作的关键是在应用约束并设置所有文本后要求视图重置布局。在设置所需的数据后,我只是将这些行添加到我的自定义 UITableViewCell
中:
//set data
//set constraints
...
contentView.setNeedsLayout()
contentView.layoutIfNeeded()
我意识到这是解决方案,因为视图在受到约束影响后不断报告其初始帧大小而不是大小。出于某种原因,所有其他视图看起来都正确,但 UILabels
不正确。
我在此处发布的答案中找到了解决方案:https://***.com/a/13542580/1637033
【讨论】:
但这在 ios 8 中不应该是必需的,它会在 UILabel 的文本更改时自动进行布局。以上是关于UILabel 不能可靠地包装的主要内容,如果未能解决你的问题,请参考以下文章
按单词包装 UILabel 并以编程方式扩展 UITableViewCell 高度