ios自动布局:动态宽度应该用SnapKit下推第二个标签,正确的方法

Posted

技术标签:

【中文标题】ios自动布局:动态宽度应该用SnapKit下推第二个标签,正确的方法【英文标题】:ios autolayout: dynamic width should push down 2nd label with SnapKit, proper way 【发布时间】:2016-09-27 14:41:48 【问题描述】:

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

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

两个标签都适合 1 行:

lbl2 在我尝试纯自动布局时不会下移:

期望:

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

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】:

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

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

【讨论】:

以上是关于ios自动布局:动态宽度应该用SnapKit下推第二个标签,正确的方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 自动布局库SnapKit的使用详解1(配置使用方法样例)

Swift 自动布局框架-SnapKit

与在 Interface Builder 中使用自动布局相比,SnapKit 有啥优势?

SnapKit 和 Dynamic UITableViewCell 布局不正确

iOS自动布局:如何动态均匀地排列项目?

SnapKit swift实现高度自适应的新浪微博布局