使用自动布局在iOS中根据内容大小调整UILabel

5

我正在尝试理解使用固有内容大小的动态布局的基础知识。如图所示,我有两个水平排列的UILabel,这将是我的默认布局。如何使布局约束条件, 以便:

  • 如果两个标签中的任何一个内容大小大于另一个,则应将其排列在垂直堆栈中
  • 同时,如果两个标签中的任何一个内容大小大于一行,我们如何使文本增长满足垂直排列

AutoLayout


如果两个标签中任意一个的内容大小大于另一个,则应该以垂直堆栈的方式排列。在第一种情况(图像)中,第二个标签的内容大小明显大于第一个标签,但您希望它们水平排列。您能否澄清一下? - Puneet Sharma
@PuneetSharma 请注意第二个部分有两个标签:“在自动布局上进行测试”和“自动布局很有趣,我很疯狂!!!:)”。默认情况下,uilabels是水平排列的。由于第二个标签文本比第一个标签多,因此第二个标签应该放在第一个标签前面。 - Nassif
这意味着两个标签应该在水平堆栈中,直到它们大于固定宽度。 - Puneet Sharma
@PuneetSharma 是的,没错 - Nassif
2个回答

1
你可以将两个标签添加到stackView中,如果intrinsicContentSize的总和与UIScreen.main.bounds.width减去stackView左右边距之和相等,则满足条件。
if (label1.intrinsicContentSize.width + label2.intrinsicContentSize.width) > (UIScreen.main.bounds.width - 48/* 48 is the left and right margins*/) {
     stackView.axis = .vertical
}else {
     stackView.axis = .horizontal
}

记得将标签的numberOfLines属性设置为0。

谢谢。我已经使用限制条件添加了我的答案。 - Nassif
@Nassif,愉快编程! - Agent Smith

0

我使用了四个约束出口,成功实现了这个条件。

考虑将L1和L2分别作为firstLabel和secondLabel水平放置 从L1到superview添加前导空间 从L1到superview添加顶部空间 为L1添加高度>=someValue 为L1添加trailing space,值>=someValue,优先级为999 从L2到L1的leading添加前导空间,给予较低优先级并进行nsconstraint输出连接 从L2到L1添加水平空间,给予较低优先级并进行nsconstraint输出连接 从L2对齐到L1,给予较低优先级并进行nsconstraint输出连接 为L2添加垂直空间,给予较低优先级并进行nsconstraint输出连接 为L2添加高度>=someValue 为L2添加trailing space,值>=someValue,优先级为999 let firstWidth : CGFloat = (firstLabel?.intrinsicContentSize.width)! let secondWidth : CGFloat = (secondLabel?.intrinsicContentSize.width)!
如果(firstWidth + secondWidth) <= self.view.frame.size.width - 45.0,则
secondLabelLeadingConstraintTofirstLabelLeading?.priority = UILayoutPriority(rawValue: 250) secondLabelSpacingConstraintTofirstLabel?.priority = UILayoutPriority(rawValue: 1000) secondLabelTopConstraintTofirstLabelTop?.priority = UILayoutPriority(rawValue: 1000) secondLabelTopConstraintTofirstLabelBottom?.priority = UILayoutPriority(rawValue: 250)
否则,
secondLabelLeadingConstraintTofirstLabelLeading?.priority = UILayoutPriority(rawValue: 1000) secondLabelSpacingConstraintTofirstLabel?.priority = UILayoutPriority(rawValue: 250) secondLabelTopConstraintTofirstLabelTop?.priority = UILayoutPriority(rawValue: 250) secondLabelTopConstraintTofirstLabelBottom?.priority = UILayoutPriority(rawValue: 1000)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接