Before Auto-layout, I've been animating a background's height in a project by setting the frame over 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)
})
}
After I converted my project to auto layout, I noticed that the animation occurs but the background height snaps back to the original size/style (interface builder setting) after. I read that when Auto-layout is turned on, the constraints will overwrite setting the UIView
dimensions with CGRect
.
Therefore I'm wondering how to go about achieving the same height change animation effect with Auto-layout ON.
Give your backgroundView a height constraint, and make an IBOutlet to it. In code, modify the constraint's constant value.
func AnimateBackgroundHeight() {
UIView.animateWithDuration(0.5, animations: {
self.heightCon.constant = 600 // heightCon is the IBOutlet to the constraint
self.view.layoutIfNeeded()
})
}
Also for those of you who find this post trying to figure out why a transition changing a view's size will be blocky or unclean you just need to find the view in charge and call self.view.layoutIfNeeded()
inside of the UIView.animateWithDuration
block. I was banging my head against the wall trying different things with constraints and making frames until realizing that self.view.layoutIfNeeded()
will handle making the transition smooth as long as you are placing it in the right location.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With