Ограничение Anchor сжимает superview вместо увеличения вложенного представления

Пользовательское представление находится в IB путем перетаскивания объекта UIView из библиотеки, и его имя класса устанавливается в имя класса пользовательского представления. Это пользовательское представление имеет вложенное представление, которое добавляется init?(coder aDecoder: NSCoder).

Как должны быть составлены ограничения типа привязки, и где они должны быть расположены, чтобы подвида _centralLabel был установлен централизованно в пользовательском представлении, и его размеры составляют 25% от размеров пользовательского представления?

Если код написан так:

override func updateConstraints() {
    if !_subviewsConstraintsAdded {
        _centralLabel.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.25).isActive = true
        _centralLabel.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.25).isActive = true
        _centralLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        _centralLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        _subviewsConstraintsAdded = true
    }
    super.updateConstraints()
}

Результатом кода является то, что вместо того, чтобы установить размер _centralLabel равным 25% от пользовательского представления, пользовательское представление сжимается до (0,0), который является размером _centralLabel при вызове updateConstraints ().

1 ответ

  1. Недостающий бит был, что:

    _centralLabel.translatesAutoresizingMaskIntoConstraints = false
    

    который должен быть расположен где-то после программного создания экземпляра подвида с этой строкой:

    _centralLabel = UILabel()
    

    После этой коррекции подвида _centralLabel увеличился и переместился в центр представления, в то время как само представление осталось в исходном размере, форме и положении.