UIStackView неудовлетворительные ограничения на автоматическое расположение - PullRequest
0 голосов
/ 05 декабря 2018

У меня UIStackView определен в раскадровке с высотой первой кнопки, равной 70, и другой, установленной на 45. Я получаю эту ошибку автоматического определения местоположения:

 [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
 (
"<NSLayoutConstraint:0x280f614f0 UIButton:0x10641a120.height == 45   (active)>",
"<NSLayoutConstraint:0x280f60e60 UIButton:0x106418f80.height == 70   (active)>",
"<NSLayoutConstraint:0x280f604b0 'UISV-alignment' UIButton:0x10641a120.bottom == UIButton:0x106418f80.bottom   (active)>",
"<NSLayoutConstraint:0x280f63cf0 'UISV-alignment' UIButton:0x10641a120.top == UIButton:0x106418f80.top   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x280f60e60 UIButton:0x106418f80.height == 70   (active)>

Я понимаю, что UIStackView не может принимать разные высотыUIButton, это правильно, и как UIStackView может принимать различные высоты или ширины своих элементов?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Что-то в ваших ограничениях просмотра стека вызывает проблему.

Вот действительный макет:

enter image description here

со стекомПросмотр свойств:

enter image description here

Результат до добавления третьей кнопки с помощью кода:

enter image description here

И результат после добавления третьей кнопки (ограничение высоты 60) с помощью кода:

enter image description here

Нетпредупреждения или ошибки автоматической разметки.

Код (связанный с кнопкой 1) добавляет / удаляет Button 3 как упорядоченное подпредставление представления стека:

class TestViewController: UIViewController {

    @IBOutlet var theStackView: UIStackView!

    var thirdButton: UIButton = {
        let b = UIButton()
        b.translatesAutoresizingMaskIntoConstraints = false
        b.setTitle("Button 3", for: .normal)
        b.backgroundColor = .red
        return b
    }()

    @IBAction func doAddThird(_ sender: Any) {

        if theStackView.arrangedSubviews.count == 2 {

            theStackView.addArrangedSubview(thirdButton)

        } else {

            if let v = theStackView.arrangedSubviews.last {
                v.removeFromSuperview()
            }

        }

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // finish initializing the third button
        if let v = theStackView.arrangedSubviews.first as? UIButton {
            thirdButton.titleLabel?.font = v.titleLabel?.font
        }

        NSLayoutConstraint.activate([
            thirdButton.heightAnchor.constraint(equalToConstant: 60),
            ])

    }   
}
0 голосов
/ 05 декабря 2018

Stackview примет размеры своих компонентов, если вы не дадите ему ограничения по высоте и ширине.Похоже, что вы указываете вашему stackView определенную высоту (либо потому, что у вас есть ограничение по высоте, либо два ограничения по позиции Y, которые подразумевают высоту).Вы не можете одновременно указать, что stackView имеет высоту, и указать, что все его организованные представления имеют высоту, если эти два значения не совпадают в точности.Так, например, если вы укажете, что высота стека равна 150, а ваши кнопки имеют высоту 45 и 70, то кнопка с наименьшим приоритетом объятия контента теряет и расширяется, чтобы занять дополнительные 35 точек пространства, необходимых для представления стека.150 баллов.

Быстрые решения:

  1. Снять ограничение на отображение стека;теперь он будет равняться сумме максимума его элементов.
  2. Добавьте пустой UIView в стек и присвойте ему содержимое, равное 1, и это займет любое дополнительное пространство (это работает, только если вашстек больше, чем его элементы; если он слишком мал, вам нужно уменьшить размер упорядоченных подпунктов).
...