Обновление ограничений в Swift 5

Я пытался деактивировать и повторно активировать... Однако я не могу понять, как это сделать... У меня есть код для использования в качестве примера, но он продолжает меня подводить, если кто-нибудь знает, как обновить ограничение в Swift 5, пожалуйста, дайте я знаю... Я знаю, что updateConstraint() существует, просто не знаю, как его использовать.

let constraint1: NSLayoutConstraint? = text.bottomAnchor.constraint(equalTo: view.bottomAnchor)

let constraint2: NSLayoutConstraint? = text.bottomAnchor.constraint (equalTo: view.bottomAnchor, constant: 5)

if acondition {
constraint1?.isActive = false
constraint2.isActive = true
} else {
constraint2.isActive = false
constraint1.isActive = true
}

person PandaDev    schedule 17.05.2020    source источник
comment
Отвечает ли это на ваш вопрос? [Программно отключить ограничение автоматического макета](stackoverflow.com/ вопросы/26021044/   -  person rbaldwin    schedule 17.05.2020
comment
откуда вы знаете, что он терпит неудачу? какие логи можно посмотреть в консоли? попробуйте изменить значение константы, чтобы увидеть разницу ограничений. наличие 5 не очень заметно   -  person Joshua    schedule 17.05.2020


Ответы (2)


сначала объявите переменную, после того, как установите переменную начальных ограничений в значение true и после вызова функции, которая активирует и отключает активные ограничения, попробуйте мой пример:

в классе контроллера объявите кнопку и вид, который вы хотите переместить:

let dummyView = UIView()
let button = UIButton(type: .system)

после объявления переменной для перемещения вашего представления с ограничением:

var up: NSLayoutConstraint?
var down: NSLayoutConstraint?

в ViewDiLoad установите вид, кнопку и ограничения следующим образом:

dummyView.backgroundColor = .yellow
    dummyView.translatesAutoresizingMaskIntoConstraints = false

    button.setTitle("viewDiwn", for: .normal)
    button.backgroundColor = .red
    button.setTitleColor(.white, for: .normal)
    button.titleLabel?.font = .systemFont(ofSize: 16)
    button.addTarget(self, action: #selector(handletapButton), for: .touchUpInside)// button action that call handletapButton func
    button.translatesAutoresizingMaskIntoConstraints = false

    view.addSubview(dummyView)
    up = dummyView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
    up?.isActive = true // start constraint active
    down = dummyView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 100) // constraint to activate for move the view

    dummyView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    dummyView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    dummyView.heightAnchor.constraint(equalToConstant: 50).isActive = true

    view.addSubview(button)
    button.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    button.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true
    button.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true

теперь напишите функцию для перемещения представления с помощью анимации ограничений:

@objc func handletapButton() {
    UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: {
        self.up?.isActive = false
        self.down?.isActive = true
        self.view.layoutIfNeeded()
    }, completion: nil)
}

это результат

введите здесь описание изображения

person Fabio    schedule 17.05.2020
comment
Это сработало Хорошо, однако у меня были некоторые проблемы с нетекстовыми полями/кнопками, которые я сейчас изучаю, спасибо за помощь... Я добавлю ваш ответ в качестве решения на данный момент, так как я нашел его наиболее полезным. - person PandaDev; 07.06.2020
comment
@PandaDev Я рад, что мой ответ был вам полезен, сейчас я в командировке, но если вам нужна помощь, пишите хорошо ... Как только я вернусь, я постараюсь ответить вам ... Приятного день :) - person Fabio; 08.06.2020

Возможно, вы можете проверить свой @properties и заменить weak на strong. Причина в том, что isActive = false установит self.yourConstraint = nil, поэтому вы не сможете снова использовать self.yourConstraint.

person grow4gaurav    schedule 17.05.2020
comment
Я пробовал это... похоже, это не сработало... Я все еще изучаю это, однако, спасибо за вклад, я могу найти его полезным позже в процессе разработки. - person PandaDev; 07.06.2020