自动布局的页面在执行动画效果时须要注意:swift
1).须要在viewDidAppear方法中执行动画的效果的代码。不要在viewDidLoad中执行动画
控制器的生命周期:loadView-->viewDidLoad-->willSublayout-->DidSublayout-->viewWillAppear-->viewDidAppear--—>viewWIllDisappear—>viewDidDisappear
>viewDidAppear
//界面已经出现的时候会自动调用数组
//这个方法是页面显示以后的生命周期方法 在这个方法中全部的子视图的位置 已经设置完毕闭包
2).在自动布局的页面 不可以直接修改frame 来改变视图的位置 -> 自动布局的页面视图是有 frame的app
2.1.自动布局的页面的子视图的frame 是在 viewDidlayoutSubViews 方法中 肯定的视图的frame布局
注意:自动布局的页面在使用动画效果的时候 不可以直接修改frame 须要更新约束才行动画
3).自动布局系统的会在 viewWillLayoutSubViews生命周期方法以前 '收集' 约束spa
4).若是但愿更新的约束可以提早展现动画效果的运动轨迹,须要在更新完约束以后 强制刷新动画,提早布局页面生命周期
5).要获取动画效果 必须将 提早刷新的方法layoutIfNeededci
,放在动画闭包中执行animation
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")
}
}