Swift语言中手写代码执行动画效果

自动布局的页面在执行动画效果时需要注意:

1).需要在viewDidAppear方法中执行动画的效果的代码。不要在viewDidLoad中执行动画
控制器的生命周期:loadView-->viewDidLoad-->willSublayout-->DidSublayout-->viewWillAppear-->viewDidAppear--—>viewWIllDisappear—>viewDidDisappear

>viewDidAppear
//
界面已经出现的时候会自动调用

//这个方法是页面显示之后的生命周期方法 在这个方法中所有的子视图的位置 已经设置完毕

2).在自动布局的页面 不能够直接修改frame 来改变视图的位置  -> 自动布局的页面视图是有 frame

2.1.自动布局的页面的子视图的frame 是在 viewDidlayoutSubViews 方法中 确定的视图的frame

注意:自动布局的页面在使用动画效果的时候 不能够直接修改frame 需要更新约束才行

3).自动布局系统的会在 viewWillLayoutSubViews生命周期方法之前 '收集' 约束

4).如果希望更新的约束能够提前展示动画效果的运动轨迹,需要在更新完约束之后 强制刷新动画,提前布局页面

5).要获取动画效果  必须将 提前刷新的方法layoutIfNeeded

,放在动画闭包中执行

6.> 自动布局更新约束 snp_updateXXX: 如果相同的约束存在就更新 约束不存在就直接创建约束

   private func  startAnimation() {

       
       
let OffsetY = -ScreenH + 180
       
//1.在动画闭包中 更新约束  snp_updateConstraints: 如果该约束 已经存在 就更新约束 ,如果不存在就创建约束
        //usingSpringWithDamping: 弹簧系数  0 ~ 1  越小越弹
        //initialSpringVelocity: 加速度 9.8  重力加速度  如果希望弹簧动画效果比较好 一般设置范围 弹簧系数 * 10 ~= 加速度
        //options: 动画的可选项  枚举  OC:  位移枚举  '|'  , swift 使用数组表示多个枚举选项

       
UIView .animateWithDuration(1.5, delay: 0, usingSpringWithDamping: 0.98, initialSpringVelocity: 9.8, options: [], animations: { () -> Void in
           
           
           
//explicit  明确的  在闭包中使用  capture  获取  semantics  语义的.   ---》要使用self
            self.iconImageView.snp_makeConstraints { (make) -> Void in
           
           
//自动布局系统在这个阶段并没有修改视图的frame  这个阶段只是收集了 约束的变化
                make.bottom.equalTo(self.view.snp_bottom).offset(OffsetY)
            }
          
//强制刷新页面  layoutIfNeeded
            self.view.layoutIfNeeded()
           
            }) { (
_) -> Void in
               
print("ok")
        }

    }


你可能感兴趣的:(Swift语言中手写代码执行动画效果)