AutoLayout не обновляет представления программно - Swift - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть следующий код, где я создаю и выкладываю все в коде. Я пытаюсь изменить myTopContainer, когда нажимается кнопка, но я не могу изменить ширину, изменяется только высота.

Есть идеи, почему?

func setupAutoLayout(){
    NSLayoutConstraint.activate([
        // My Container
        myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5),
        myTopContainer.heightAnchor.constraint(equalToConstant: 50),
        myTopContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15),
        myTopContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15),

        // My Button
        myButton.widthAnchor.constraint(equalToConstant: 80),
        myButton.heightAnchor.constraint(equalToConstant: 40),
        myButton.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -15),
        myButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -400)
    ])
}


@IBAction func relayoutViews(_ sender: Any) {

    UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseIn, animations: {

        self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false
        self.myTopContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 15).isActive = false

        // this is working, it changes the height
        self.myTopContainer.heightAnchor.constraint(equalToConstant: 10).isActive = true
        // this is not doing anything
        self.myTopContainer.leadingAnchor.constraint(equalTo: self.myButton.trailingAnchor).isActive = true

        self.view.layoutIfNeeded()

    })
}

enter image description here

1 Ответ

1 голос
/ 10 ноября 2019

Строка, подобная этой

self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false

Каждый раз создает новое ограничение. Он не изменяет ранее созданное ограничение.

Когда вы настраиваетеAutolayout, вы должны сохранить ссылку на ограничения, которые вы хотите позже изменить, прежде чем вызывать NSLayoutConstraint.activate() для них. Позже вы можете установить для isActive значение false для них.

Например:

var someConstraint: NSLayoutConstraint?
func setupAutoLayout(){
    let aConstraint = myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5)
    someConstraint = aConstraint
    NSLayoutConstraint.activate([
        // My Container
        aConstraint
    ])
}

func editConstraint() {
    self.someConstraint?.isActive = false
}

В любом случае, при редактировании ограничений будьте осторожны с журналами, вероятно, что-то может быть нарушено во время редактирования. Если вы видите эти журналы с нарушенным ограничением, это означает, что что-то все еще не так (даже если это выглядит визуально, это может привести к сбою или неправильной работе в другой ситуации)

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