使用故事板,我有一个2个大小等级的高度限制(一个用于常规的200pt,一个用于紧凑的100pt)。
因为我在视图出现时动画它,元素的高度从0开始(初始状态) - > 200pt为常规或100pt为紧凑(最终状态)。
这是一个简单的" zoomIn"动画。
但问题是因为我以编程方式更改常量,我失去了类大小意味着当我旋转手机时,我必须将常量设置为正确的大小而不是使用Interface Builder' s自动班级规模。
那么如何将动画应用于具有自动布局的UIElement(并且无需在viewWillLayoutSubviews,viewDidLayoutSubviews中创建意大利面条代码)?
答案 0 :(得分:1)
如果没有你的代码,它并不清楚你到底在做什么,但无论如何都是这样:)首先,当你使用自动布局时动画的最佳方法是为约束变化设置动画,例如:
myConstraint.constant = myConstraintInitialConstant
UIView.animateWithDuration(animationSpeed) {
self.view.layoutIfNeeded()
}
这里要注意的最重要的事情是约束变化是在之外的动画块,你动画的是layoutIfNeeded()。
但是你想知道你的笔尖加载时你的初始常量是什么,是吗?然后将其保存在viewDidLoad()中,例如:
private var myConstraintInitialConstant: CGFloat = 65
override func viewDidLoad() {
super.viewDidLoad()
myConstraintInitialConstant = myConstraint.constant
}
答案 1 :(得分:0)
您是否尝试使用layoutIfNeeded()/ layoutSubviews()方法?这将在添加新约束后更新UIElement的框架
我将顶部约束设置为0,然后我将其设置为动画:
override func layoutSubviews() {
super.layoutSubviews()
// I reset my constraint's constant if already animate
if(topConst.constant > 0){
topConst.constant = 0
}
self.viewToAnimate.layoutIfNeeded()
//Animate the constraint
topConst.constant = 100
UIView.animateWithDuration(0.8, delay: 0.2, usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: .CurveEaseIn, animations: { () -> Void in
self.viewToAnimate.layoutIfNeeded()
}, completion: nil)
}
我使用layoutSubviews它工作正常:D