【问题标题】:Set back to original uilayoutconstraint - zoom in animation设置回原来的uilayoutconstraint - 放大动画
【发布时间】:2016-02-29 15:03:12
【问题描述】:

使用情节提要,我有 2 种尺寸等级的高度限制(一种用于 200pt 的常规,一种用于 100pt 的紧凑型)。

因为我在视图出现时对其进行动画处理,所以元素的高度从 0(初始状态)-> 200pt 常规或 100pt 紧凑(最终状态)。

这是一个简单的“放大”动画。

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

那么如何将动画应用到具有自动布局的 UIElement(并且不必在 viewWillLayoutSubviews、viewDidLayoutSubviews 中创建意大利面条式代码)?

【问题讨论】:

    标签: ios swift animation autolayout constraints


    【解决方案1】:

    如果没有您的代码,不清楚您在做什么,但无论如何都可以:) 首先,当您使用自动布局时,最好的动画方法是为约束更改设置动画,例如:

    myConstraint.constant = myConstraintInitialConstant
    UIView.animateWithDuration(animationSpeed) {
        self.view.layoutIfNeeded()
    }
    

    这里最需要注意的是约束变化是在动画块之外,你动画的是layoutIfNeeded()。

    但是您想知道加载 nib 时的初始常量是什么,是吗?然后将其保存在 viewDidLoad() 中,例如:

    private var myConstraintInitialConstant: CGFloat = 65
    
    override func viewDidLoad() {
        super.viewDidLoad()
        myConstraintInitialConstant = myConstraint.constant
    }
    

    【讨论】:

    • 但是我如何获得不同的常量,因为我有一个用于常规和紧凑的不同常量?而且我只能得到当前正在使用的。
    • 也许看看覆盖traitCollectionDidChange:?抱歉,我从未尝试过。
    【解决方案2】:

    您是否尝试过使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多