Как оживить NSLayoutConstraint в Swift?

Я хотел бы анимировать UIImageView. Я объявил NSLayoutConstraint в viewDidLoad и использовал этот код:

UIView.animateWithDuration(1, animations: {
    myConstraint.constant = 100
    self.view.layoutIfNeeded()
}, completion: {finished in })

Почему мое изображение не двигается?

Ответ 1

К тому времени, когда вы нажмете viewDidLoad, механизм ограничений еще не был применен, и начальное местоположение представлений еще не установлено. Поэтому не стесняйтесь добавлять исходные ограничения в viewDidLoad, но вы захотите отложить animateWithDuration до более поздней стадии процесса (например, viewDidAppear).


Например, предположим, у вас есть какое-то ограничение, которое вы добавили в Интерфейсный Разработчик (IB). Вы можете добавить ссылку @IBOutlet к нему с помощью control -dragging из ограничения в схеме документа на левой панели в Интерфейсном Разработчике до редактора помощника:

enter image description here

Теперь, когда у вас есть ссылка на это ограничение, теперь вы можете программно изменить constant значение для этого ограничения (но, опять же, сделайте это в viewDidAppear, а не в viewDidLoad, если вы хотите видеть это анимированным при представлении представления):

@IBOutlet weak var topConstraint: NSLayoutConstraint!

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    topConstraint.constant = 100
    UIView.animate(withDuration: 2) {
        self.view.layoutIfNeeded()
    }
}

Процесс одинаков для программно созданных ограничений. Просто сохраните ссылку на ограничение, а затем в viewDidAppear обновите constant и затем layoutIfNeeded() вызов layoutIfNeeded().

Ответ 2

Пожалуйста, установите ограничение в viewDidAppear и попробуйте выполнить коррекцию

myConstant = 100
myConstraint.constant = myConstant
UIView.animateWithDuration(1, animations: {
self.view.layoutIfNeeded()
}, completion: {finished in })