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

Анимация высоты UIView при использовании автоматического макета с быстрым

Перед автомастером я анимировал высоту фона в проекте, установив фрейм над animateWithDuration.

func setUpBackground() {
    self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 10)
    self.backgroundView.backgroundColor = UIColorFromRGB(0x2d2d2d).CGColor
}

func AnimateBackgroundHeight() {
    UIView.animateWithDuration(0.5, animations: {
        self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 600)    
    })
}

После преобразования моего проекта в автоматический макет, я заметил, что анимация происходит, но высота фона возвращается к исходному размеру/стилю (настройке построителя интерфейса) после. Я прочитал, что при включении Auto-layout ограничения будут перезаписывать параметры UIView с помощью CGRect.

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

4b9b3361

Ответ 1

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

func AnimateBackgroundHeight() {
    UIView.animateWithDuration(0.5, animations: {
         self.heightCon.constant = 600 // heightCon is the IBOutlet to the constraint
         self.view.layoutIfNeeded()    
    })
}

Ответ 2

Также для тех из вас, кто находит это сообщение, пытаясь понять, почему переход, изменяющий размер представления, будет блочным или нечистым, вам просто нужно найти представление и вызвать self.view.layoutIfNeeded() внутри блока UIView.animateWithDuration. Я ударился головой о стену, пробирая разные вещи с ограничениями и создавая кадры, до тех пор, пока не осознаю, что self.view.layoutIfNeeded() будет работать, делая переход гладким, пока вы размещаете его в нужном месте.