У мене є UIView
і я встановлюю обмеження за допомогою Xcode Interface Builder.
Тепер мені потрібно оновити цю UIView's
постійну висоту програмно.
Існує така функція myUIView.updateConstraints()
, але я не знаю, як її використовувати.
У мене є UIView
і я встановлюю обмеження за допомогою Xcode Interface Builder.
Тепер мені потрібно оновити цю UIView's
постійну висоту програмно.
Існує така функція myUIView.updateConstraints()
, але я не знаю, як її використовувати.
Відповіді:
Виберіть обмеження по висоті у конструктора інтерфейсів і візьміть його з розетки. Отже, коли ви хочете змінити висоту перегляду, ви можете використовувати наведений нижче код.
yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()
Метод updateConstraints()
- це метод примірника UIView
. Це корисно, коли ви встановлюєте обмеження програмно. Він оновлює обмеження для перегляду. Для більш детальної інформації натисніть тут .
Якщо у вас представлення з кількома обмеженнями, набагато простішим способом без створення декількох торгових точок є:
У програмі інтерфейсу вкажіть кожне обмеження, яке ви хочете змінити ідентифікатор:
Тоді в коді ви можете змінити кілька обмежень на зразок:
for constraint in self.view.constraints {
if constraint.identifier == "myConstraint" {
constraint.constant = 50
}
}
myView.layoutIfNeeded()
Ви можете надати декілька обмежень одному ідентифікатору, тим самим дозволяючи групувати обмеження та змінювати всі одразу.
Зміна HeightConstraint
і WidthConstraint
без створення IBOutlet
.
Примітка. Призначте обмеження по висоті чи ширині у таблиці розгортки або XIB. після отримання цього Обмеження за допомогою цього розширення.
Ви можете використовувати це розширення для отримання обмеження по висоті та ширині:
extension UIView {
var heightConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .height && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
var widthConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .width && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
}
Ви можете використовувати:
yourView.heightConstraint?.constant = newValue
first(where: ...)
ви можете використати одразу замість filter
+first
Перетягніть обмеження у свій ВК як IBOutlet. Тоді ви можете змінити пов'язане з цим значення (та інші властивості; перевірити документацію):
@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!
func updateConstraints() {
// You should handle UI updates on the main queue, whenever possible
DispatchQueue.main.async {
self.myConstraint.constant = 10
self.myView.layoutIfNeeded()
}
}
Ви можете оновити обмеження за допомогою плавної анімації, якщо хочете, дивіться фрагмент коду нижче:
heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
Якщо вищевказаний метод не працює, переконайтеся, що ви оновите його в блоці Dispatch.main.async {}. Тоді вам не потрібно викликати метод layoutIfNeeded ().
Спочатку підключіть обмеження висоти до нашого контролера перегляду для створення IBOutlet, як показано на наведеному нижче коді
@IBOutlet weak var select_dateHeight: NSLayoutConstraint!
потім поставте наведений нижче код, щоб переглядати, чи завантажувались чи всередині будь-яких дій
self.select_dateHeight.constant = 0 // we can change the height value
якщо він знаходиться всередині кнопки, натисніть
@IBAction func Feedback_button(_ sender: Any) {
self.select_dateHeight.constant = 0
}
Щоб оновити обмеження в макеті, вам потрібно лише оновити постійну властивість та виклик layoutIfNeeded після.
myConstraint.constant = newValue
myView.layoutIfNeeded()
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.
//Connect them from Interface
@IBOutlet viewHeight: NSLayoutConstraint!
@IBOutlet view: UIView!
private func updateViewHeight(height:Int){
guard let aView = view, aViewHeight = viewHeight else{
return
}
aViewHeight.constant = height
aView.layoutIfNeeded()
}