ios autolayout:动态宽度应该用SnapKit按正确方式推下第二个标签

时间:2016-09-27 14:41:49

标签: ios swift autolayout ios-autolayout snapkit

我有2 UILabel秒。 lbl1的文字可以更改,而lbl2的文字是静态的。

它们最初都设置在同一条线上。我将lbl1' numberOfLines设置为0(无穷大)。当lbl2的宽度侵占lbl1时,我希望lbl1向下推并将其顶部对齐到lbl2的底部。的空间。我有一个当前的解决方案,但感觉有一种我缺少的纯粹的自动布局方式。任何帮助都会很棒!

两个标签都适合1行:

enter image description here

lbl2在我的纯自动布局尝试中没有降低:

enter image description here

所需:

enter image description here

目前的解决方案有效,但感觉不理想:

import XCPlayground
import SnapKit
import UIKit

let screen: UIView = UIView(frame: CGRectMake(0,0,320,568))
XCPlaygroundPage.currentPage.liveView = screen
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let lbl1: UILabel = UILabel()
lbl1.text = "Short Text asnoetuha 1 1 1 1 "
lbl1.numberOfLines = 0
lbl1.backgroundColor = UIColor.whiteColor()

let lbl2: UILabel = UILabel()
lbl2.text = "Amount Text"
lbl2.backgroundColor = UIColor.yellowColor().colorWithAlphaComponent(0.5)

screen.addSubview(lbl1)
screen.addSubview(lbl2)

lbl1.snp_makeConstraints { (make: ConstraintMaker) in
  make.top.leading.equalTo(screen)
  make.width.lessThanOrEqualTo(screen.snp_width)
}

lbl2.snp_makeConstraints { (make: ConstraintMaker) in
  // Below lines feel un-ideal
  let lbl2X: CGFloat = screen.frame.width - lbl2.intrinsicContentSize().width
  let lbl1RightX: CGFloat = screen.frame.origin.x + lbl1.intrinsicContentSize().width
  let hasOverlap: Bool = lbl1RightX >= lbl2X

  make.top.equalTo(hasOverlap ? lbl1.snp_bottom : lbl1.snp_top).priorityLow()
  make.trailing.equalTo(screen)
}

1 个答案:

答案 0 :(得分:-1)

我相信你并没有以正确的方式接近这一点。你应该能够创建一个函数来监听lbl1的右锚何时与lbl2的左锚点接触(使用SnapKit非常容易)。

如果发生这种情况,您可以调用一个函数来重新设置约束,使其适合您提供的图像。这是通过调用snap_updateConstraints或snp_remakeConstraints完成的。那么你的约束代码应该是直截了当的,因为你只需将lbl1的底部锚点固定到lbl2的顶部锚点,然后再做其他约束直到你得到所需的效果。