У меня есть два UILabel с (оранжевым и розовым), один - многострочный, а другой - только один. Два из этого компонента (которые имеют одинаковые тексты) находятся внутри UIStackView, а этот Stackview находится внутри UITableView (Автоматическое измерение). Моя проблема в том, что если я установлю один и тот же текст на UILabels, их высоты будут выглядеть по-разному. Я ищу эту проблему в течение двух дней, но ни одно из решений не работает для меня.
Неоднозначные предупреждения макета для UILabels в UITableViewCell
Label1 имеет верхний, левый, правый макет и Label2 имеет верхний, левый, правый, нижний. UIStackView распределение: .fillProportionally
Я хочу, чтобы метки имели одинаковую высоту, если они, например, одинаковы;
Для View1;
- Label1 = "Многострочная метка 1 Текст, состоящий из двух строк"
Label2 = "Однострочный текст метки 2"
Для View2;
Label1 = «Многострочная метка 1 Текст, состоящий из двух строк»
- Label2 = «Однострочный метка 2»
То, что я хочу, это: Высота view1 и view2 должны быть одинаковыми, потому что они имеют одинаковые элементы с одинаковым содержанием. Stackview с этим view1 и view2 имеет заполнение пропорционально, опция должна установить его высоту в соответствии с view1 + view2 height.
Контейнерное представление, которое получает xib-файл (Это просто xib-файл, в котором есть две метки с ограничениями, о которых я упоминал ранее).
class ViewWithLabel: UIView {
@IBOutlet weak var firstLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
@IBOutlet var containerView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
self.translatesAutoresizingMaskIntoConstraints = false
// first: load the view hierarchy to get proper outlets
let name = String(describing: type(of: self))
let nib = UINib(nibName: name, bundle: .main)
nib.instantiate(withOwner: self, options: nil)
addSubview(containerView)
containerView.frame = self.bounds
containerView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
}
convenience init(firstLabelText: String, secondLabelText: String) {
self.init()
firstLabel.text = firstLabelText
secondLabel.text = secondLabelText
}
override func layoutSubviews() {
super.layoutSubviews()
firstLabel.preferredMaxLayoutWidth = self.frame.width
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Другое контейнерное представление, которое имеет Stackview и получает вышеуказанноепросмотреть и добавить в Stackview.
class ViewWithStack: UIView {
let verticalStackView: UIStackView = {
let s = UIStackView()
s.distribution = .fillEqually
s.spacing = 0
s.axis = .vertical
s.translatesAutoresizingMaskIntoConstraints = false
return s
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.translatesAutoresizingMaskIntoConstraints = false
self.backgroundColor = UIColor.white
self.layer.cornerRadius = 6.0
self.layer.applySketchShadow(color: UIColor(red:0.56, green:0.56, blue:0.56, alpha:1), alpha: 0.2, x: 0, y: 0, blur: 10, spread: 0)
addSubview(verticalStackView)
verticalStackView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
let bottomEqual = verticalStackView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0)
bottomEqual.isActive = true
verticalStackView.leftAnchor.constraint(equalTo: self.leftAnchor,constant: 0).isActive = true
verticalStackView.rightAnchor.constraint(equalTo: self.rightAnchor,constant: 0).isActive = true
verticalStackView.layoutMargins = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
verticalStackView.isLayoutMarginsRelativeArrangement = true
}
convenience init(orientation: NSLayoutConstraint.Axis,labelsArray: [UIView]) {
self.init()
verticalStackView.axis = orientation
for label in labelsArray {
verticalStackView.addArrangedSubview(label)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
РЕДАКТИРОВАТЬ: Если я пишу firstLabel.sizeToFit()
в layoutSubviews
функции. Первая метка выглядит фиксированной, но вид содержимого по-прежнему имеет одинаковую высоту, и между меткой 1 и меткой 2 имеется большой разрыв.
РЕДАКТИРОВАТЬ 2: Когда я добавляю setContentHuggingPriority(.required, for: .vertical)
для меток. Первый лейбл выглядит хорошо, но второй - тоже больше.