Разная высота для одного и того же текста UILabel - PullRequest
0 голосов
/ 16 октября 2019

У меня есть два 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.

example screen example

Контейнерное представление, которое получает 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) для меток. Первый лейбл выглядит хорошо, но второй - тоже больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...