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

问题描述 投票:4回答:2

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

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

AutoLayout

ios autolayout uilabel
2个回答
1
投票

您可以向stackView添加两个标签,如果使用UIScreen.main.bounds.width的intrinsicContentSize和check的总和减去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。


0
投票

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

  • 将L1和L2视为分别水平放置的第一个Label和第二个Label
  • 从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) }
© www.soinside.com 2019 - 2024. All rights reserved.