回到原始的uilayoutconstraint - 放大动画

时间:2016-02-29 15:03:13

标签: ios swift animation autolayout constraints

使用故事板,我有一个2个大小等级的高度限制(一个用于常规的200pt,一个用于紧凑的100pt)。

因为我在视图出现时动画它,元素的高度从0开始(初始状态) - > 200pt为常规或100pt为紧凑(最终状态)。

这是一个简单的" zoomIn"动画。

但问题是因为我以编程方式更改常量,我失去了类大小意味着当我旋转手机时,我必须将常量设置为正确的大小而不是使用Interface Builder' s自动班级规模。

那么如何将动画应用于具有自动布局的UIElement(并且无需在viewWillLayoutSubviews,viewDidLayoutSubviews中创建意大利面条代码)?

2 个答案:

答案 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