2 개의 레이블 (예 : leftLabel, rightLabel)을두고 가로 레이블을 배치하여 leftLabel이 늘어나고 rightLabel이 단일 문자 아이콘 (예 : ">")에 맞도록하십시오. 따라서 두 레이블 레이아웃은 양쪽 정렬됩니다. 이처럼 ...2 개의 양쪽 맞춤 레이블이있는 가로 방향의 UIStackView
입니다 코드 내가 가진 - 결과 아래에 제공
class StackViewController: UIViewController {
/// Main vertical outer/container stack view that pins its edges to this view in storyboard (i.e. full screen)
@IBOutlet weak private var containerStackView: UIStackView!
private var leftLabel: UILabel = {
let leftLabel = UILabel(frame: .zero)
leftLabel.font = .preferredFont(forTextStyle: .body)
leftLabel.numberOfLines = 0 // no text truncation, allows wrap
leftLabel.backgroundColor = .orange
return leftLabel
}()
private var rightLabel: UILabel = {
let rightLabel = UILabel(frame: .zero)
rightLabel.font = .preferredFont(forTextStyle: .body)
// Set CHCR as high so that label sizes itself to fit the text
rightLabel.setContentHuggingPriority(UILayoutPriorityDefaultHigh, for: .horizontal)
rightLabel.setContentCompressionResistancePriority(UILayoutPriorityDefaultHigh, for: .horizontal)
rightLabel.backgroundColor = .green
return rightLabel
}()
override func viewDidLoad() {
super.viewDidLoad()
prepareAndLoadSubViews()
// Note, the text required to be set in viewDidAppear, not viewDidLoad, otherwise rightLabel stretches to fill!!
leftLabel.text = "This is left label text that may go in multiple lines"
rightLabel.text = ">" // Always a single character
}
/// Dynamically creates a horizontal stack view, with 2 labels, in the container stack view
private func prepareAndLoadSubViews() {
/// Prepare the horizontal label stack view and add the 2 labels
let labelStackView = UIStackView(arrangedSubviews: [leftLabel, rightLabel])
labelStackView.axis = .horizontal
labelStackView.distribution = .fillProportionally
labelStackView.alignment = .top
containerStackView.addArrangedSubview(labelStackView)
containerStackView.addArrangedSubview(UIView())
}
}
(즉 leftLabel 폭이 뷰 디버거에서 0) -
참고 : viewDidAppear에서 텍스트 세트 코드를 이동하면 올바르게 작동합니다.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Note, the text required to be set in viewDidAppear, not viewDidLoad, otherwise rightLabel stretches to fill!!
leftLabel.text = "This is left label text that may go in multiple lines"
rightLabel.text = ">" // Always a single character
}
왜? 그리고 viewDidLoad 전에 콘텐츠 포옹/압축 저항 우선 순위를 설정할 수 있습니까?
자신과 조언을 시도해 주셔서 감사합니다. 맞습니다, 제약 조건을 사용하여 동일한 레이아웃을 얻을 수 있습니다. 그러나 leftLabel을 전폭 늘려야 데이터를 기반으로 rightLabel을 숨길 수있는 추가 요구 사항이 있습니다. 자동 레이아웃을 통해이를 달성하려면 몇 가지 추가적인 제약이 필요합니다. 또한,이 셀 전체적으로 나는 몇개의 라벨/이미지 뷰를 곧 추가해야하므로, 제약 조건보다 스택 뷰를 사용하는 것을 선호합니다. – Ashok