0

2UILabel秒あります。lbl1のテキストは変更できますが、lbl2のテキストは静的です。

どちらも最初は同じ行に設定されています。を(無限大)lbl1numberOfLines設定しました。の幅がのスペースに食い込んでいる場合、 の上部を の下部に合わせて押し下げ0たいと思います。現在の解決策がありますが、欠けている純粋な自動レイアウトの方法があると感じています。どんな助けでも素晴らしいでしょう!lbl2lbl1lbl1lbl2

両方のラベルが 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)
}
4

1 に答える 1

-1

私はあなたがこれに正しい方法でアプローチしていないと信じています. lbl1 の右アンカーが lbl2 の左アンカーと接触するタイミングをリッスンする関数を作成できるはずです (SnapKit を使用すると非常に簡単です)。

これが発生した場合は、提供した画像に適合するように制約を再作成する関数を呼び出します。これは、snap_updateConstraints または snp_remakeConstraints への呼び出しで行われます。次に、lbl1 の下部アンカーを lbl2 の上部アンカーに固定し、目的の効果が得られるまで他の制約を作成するだけなので、制約コードは簡単です。

于 2016-09-27T15:01:03.087 に答える