Як оновити постійне обмеження висоти UIView програмно?


102

У мене є UIViewі я встановлюю обмеження за допомогою Xcode Interface Builder.

Тепер мені потрібно оновити цю UIView'sпостійну висоту програмно.

Існує така функція myUIView.updateConstraints(), але я не знаю, як її використовувати.


Візьміть розетку обмеження висоти і встановіть програмно
iMuzahid

ви можете використовувати це посилання або це посилання для довідок.
Амна Фархан

Ось спосіб оновлення одиночних або декількох обмежень. stackoverflow.com/a/54171693/8861442
Сарат Кумар Раджендран

Відповіді:


217

Виберіть обмеження по висоті у конструктора інтерфейсів і візьміть його з розетки. Отже, коли ви хочете змінити висоту перегляду, ви можете використовувати наведений нижче код.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Метод updateConstraints()- це метод примірника UIView. Це корисно, коли ви встановлюєте обмеження програмно. Він оновлює обмеження для перегляду. Для більш детальної інформації натисніть тут .


58
Сьогодні я дізнався, що обмеження можна перетворити на розетку, і звідти я можу робити з цим все, що хочу. Спасибі
Chris Mikkelsen

@ParthAdroja, брато, погляньте на моє запитання stackoverflow.com/questions/46034278/… ?
Phyu May

У мене немає файлу xib, і як встановити вашHeightConstraint в UIView програмно?
новинник

@newszer ви повинні звернутися до іншої теми для цього stackoverflow.com/questions/31651022 / ...
Parth Adroja

Я чув, що нам слід викликати layoutIfNeeded після зміни постійного обмеження. чому? а іноді я закликаю layoutIfNeeded inside viewWillLayoutSubviews та viewDidLayoutSubviews. це добре?
mnemonic23

104

Якщо у вас представлення з кількома обмеженнями, набагато простішим способом без створення декількох торгових точок є:

У програмі інтерфейсу вкажіть кожне обмеження, яке ви хочете змінити ідентифікатор:

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

Тоді в коді ви можете змінити кілька обмежень на зразок:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

Ви можете надати декілька обмежень одному ідентифікатору, тим самим дозволяючи групувати обмеження та змінювати всі одразу.


Це добре працює, але мені зручніше просто використовувати звичайну колекцію розетки для групування обмежень. Наприклад, на думку, з якою я працюю, існує 47 обмежень, але лише 6, які я хочу змінити під час виконання, тому це набагато менший цикл. Це також не вимагає синхронізації рядків між двома різними місцями.
Gary Z

1
Дякую Джорджу за цю пораду. Це справжня допомога для деяких поточних макетів, з якими я граю.
Jim Hillhouse

1
КРАСИВИЙ
Вільям Ян

Привіт, я використовую його тим же шляхом, але він ніколи не йде у випадку if, і я дав той же ідентифікатор.
Rob13

Мені було цікаво, чи можна назвати обмеження. Чудова відповідь!
ShadeToD

35

Зміна 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 

2
Є метод, який first(where: ...)ви можете використати одразу замість filter+first
В’ячаслав Герчичев

13

Перетягніть обмеження у свій ВК як 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()
    }
}

9

Ви можете оновити обмеження за допомогою плавної анімації, якщо хочете, дивіться фрагмент коду нижче:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

Якщо вищевказаний метод не працює, переконайтеся, що ви оновите його в блоці Dispatch.main.async {}. Тоді вам не потрібно викликати метод layoutIfNeeded ().


4

Спочатку підключіть обмеження висоти до нашого контролера перегляду для створення 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

}

1

Щоб оновити обмеження в макеті, вам потрібно лише оновити постійну властивість та виклик layoutIfNeeded після.

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
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()
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.