Подтвердить что ты не робот

Как программно обновить ограничение постоянной высоты UIView?

У меня есть UIView и я устанавливаю ограничения, используя Xcode Interface Builder.

Теперь мне нужно обновить UIView's высоты UIView's программным UIView's.

Есть функция, похожая на myUIView.updateConstraints(), но я не знаю, как ее использовать.

4b9b3361

Ответ 1

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

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Метод updateConstraints() - это метод экземпляра UIView. Это полезно при программном программировании ограничений. Он обновляет ограничения для представления. Для более подробной информации нажмите здесь.

Ответ 2

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

В построителе интерфейсов укажите каждое ограничение, которое вы хотите изменить идентификатор:

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

Затем в коде вы можете изменить несколько ограничений следующим образом:

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

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

Ответ 3

Измените HeightConstraint и WidthConstraint без создания IBOutlet.

Примечание. Назначьте ограничение высоты или ширины в раскадровке или в файле XIB. после получения этого ограничения с помощью этого расширения.

Вы можете использовать это расширение, чтобы получить ограничение высоты и ширины.

extension UIView {

var heightConstaint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstaint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

Вы можете использовать

yourView.heightConstaint?.constant = newValue 

Ответ 4

Перетащите ограничение в свой VC как 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()
    }
}

Ответ 5

Вы можете обновить ограничение с помощью плавной анимации, если хотите, см. Фрагмент кода ниже:

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

Ответ 6

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

}

Ответ 7

Если вышеуказанный метод не работает, убедитесь, что вы его обновили в разделе Dispatch.main.async {}. Вам не нужно вызывать метод layoutIfNeeded().

Ответ 8

Чтобы обновить ограничение макета, вам нужно только обновить свойство константы и вызвать layoutIfNeeded после.

myConstraint.constant = newValue
myView.layoutIfNeeded()

Ответ 9

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()
}