在iOS中使用autolayout调整内容大小的UILabel

时间:2018-03-05 04:32:28

标签: ios autolayout uilabel

我试图了解使用内在内容大小的动态布局的基础。如图所示,我有两个水平的UILabel,这将是我的默认布局。如何使布局约束以便

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

AutoLayout

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

我能够使用四个约束出口来实现这个条件。

  • 考虑L1& L2作为firstLabel& secondLabel分别放置在地平线上
  • 从L1到superview添加前导空格
  • 将顶部空间从L1添加到superview
  • 为L1> = someValue
  • 添加高度
  • 为L1添加尾随空格,其值为> = someValue,优先级为999
  • 从L2添加前导空格到L1的前导,给予低优先级并建立nsconstraint插座连接
  • 从L2添加水平空间到L1,给予低优先级并进行nsconstraint插座连接
  • 将对齐顶部从L2添加到L1,给予低优先级并进行nsconstraint插座连接
  • 从L2添加垂直空间到L1,给予低优先级并建立nsconstraint插座连接
  • 为L2添加高度> = someValue
  • 为L2添加尾随空格,其值为> = someValue,优先级为999

        let firstWidth : CGFloat = (firstLabel?.intrinsicContentSize.width)!
    let secondWidth : CGFloat = (secondLabel?.intrinsicContentSize.width)!
    
    if (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)
    
    }
    else {
    
        secondLabelLeadingConstraintTofirstLabelLeading?.priority = UILayoutPriority(rawValue: 1000)
        secondLabelSpacingConstraintTofirstLabel?.priority = UILayoutPriority(rawValue: 250)
        secondLabelTopConstraintTofirstLabelTop?.priority = UILayoutPriority(rawValue: 250)
        secondLabelTopConstraintTofirstLabelBottom?.priority = UILayoutPriority(rawValue: 1000)
    
    }