Быстрая анимация привязки высоты анимации не работает должным образом

#ios #swift

Вопрос:

Здесь я пытаюсь обновить привязку высоты кнопки от 100 до 300 и от 300 до 100, например, развернуть и свернуть. Я знаю, что мы можем создавать var constraint: NSLayoutConstraint и обновлять. Но в моем случае у меня есть UIStackView, содержащий несколько кнопок, основанных на конфигурации сервера. Поэтому я не могу создавать NSLayoutConstraint явно.

Итак, я хочу обновить ограничение по нажатию кнопки. Ниже я добавляю свой код. Мы очень признательны за помощь.

 override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton()
        self.view.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .systemBlue
       
        button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16).isActive = true
        button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16).isActive = true
        button.heightAnchor.constraint(equalToConstant: 100).isActive = true
        button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

        button.addTarget(self, action: #selector (onButtonAction(_:)), for: .touchUpInside)

    }
    
    @objc func onButtonAction(_ sender: UIButton) {
        sender.heightAnchorConstrint?.constant = sender.heightAnchorConstrint!.constant == 100 ? 300 : 100
        UIView.animate(withDuration: 1) {
            self.view.layoutIfNeeded()
        }
    }


extension UIView {
    var heightAnchorConstrint: NSLayoutConstraint? {
        return constraints.first { $0.firstAnchor == heightAnchor }
    }
}

 

Комментарии:

1. Так в чем же проблема?

2. не анимация от 100 до 300 при первом щелчке .. от 300 до 100 при втором щелчке

Ответ №1:

Проблема в нахождении ограничения в UIView расширении.

Измените свой добавочный номер с помощью этого

 extension UIButton {
    var heightAnchorConstrint: NSLayoutConstraint? {
        return self.constraints.last(where: { ($0.firstItem as? UIButton == self amp;amp; $0.firstAttribute == .height) })
    }
}
 

Комментарии:

1. Спасибо за ваш ответ, вы заметили одну вещь? На самом деле кнопка также увеличивает высоту и меняет верхний якорь. Он должен быть на одном и том же месте сверху и должен расти только к низу. Надеюсь, вы поняли мою мысль.

2. Но да, мы должны изменить только одно ограничение. swift button.topAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 100).isActive = true

Ответ №2:

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

 let button = UIButton()

var onehundred: NSLayoutConstraint?
var threehundred: NSLayoutConstraint?

override func viewDidLoad() {
        super.viewDidLoad()

        
    view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.backgroundColor = .systemBlue
    button.addTarget(self, action: #selector (onButtonAction), for: .touchUpInside)
    
    button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16).isActive = true
    button.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -16).isActive = true
    onehundred = button.heightAnchor.constraint(equalToConstant: 100)
    onehundred?.isActive = true // activate only the first height
    threehundred = button.heightAnchor.constraint(equalToConstant: 300)
    button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
    
}
 

теперь вызовите свою функцию для анимации кнопки:

 var hundred = 1 // set var for height button control
    
@objc func onButtonAction() {
    if hundred == 1 {
        UIView.animate(withDuration: 1) {
            self.onehundred?.isActive = false
            self.threehundred?.isActive = true
            self.view.layoutIfNeeded()
            self.hundred = 0
        }
    } else {
        UIView.animate(withDuration: 1) {
            self.threehundred?.isActive = false
            self.onehundred?.isActive = true
            self.view.layoutIfNeeded()
            self.hundred = 1
        }
    }
}
 

Это и есть результат:

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

Комментарии:

1. С помощью этого вы можете оптимизировать действие кнопки. { self.onehundred?.isActive.toggle() self.threehundred?.isActive.toggle() UIView.animate(withDuration: 1) { self.view.layoutIfNeeded() } }

2. @RajaKishan Да, вы правы, но я хочу показать ему базовый код для правильного пути разработчика. После того, как он изучит основы, он сможет работать с toggle() и расширениями…