#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() и расширениями…