作者:汉臣Y | 来源:互联网 | 2023-10-16 16:11
UIView的通用动画letviewUIView(frame:CGRectMake(10.0,10.0,100.0,40.0))self.view.addSubview(vie
UIView的通用动画
let view = UIView(frame: CGRectMake(10.0 , 10.0 , 100.0 , 40.0 )) self.view .addSubview (view) view.backgroundColor = UIColor.lightGrayColor () // 位置改变 var frame = view.frame UIView.animateWithDuration (0.6 , delay: 2.0 , options: UIViewAnimationOptions.CurveEaseInOut , animations: {() -> Void in frame.origin .x = 200.0 view.frame = frame}) {(finished:Bool) -> Void in UIView.animateWithDuration (0.6 ) {() -> Void in frame.origin .x = 10.0 view.frame = frame} }
CABasicAnimation核心动画 1、CABasicAnimation类只有三个属性: fromValue:开始值 toValue:结束值 Duration:动画的时间 repeatCount:重复次数
2、通过animationWithKeyPath键值对的方式设置不同的动画效果 transform.scale transform.scale.x transform.scale.y transform.rotation.z opacity margin zPosition backgroundColor cornerRadius borderWidth bounds contents contentsRect cornerRadius frame hidden mask masksToBounds opacity position shadowColor shadowOffset shadowOpacity shadowRadius
let view = UILabel(frame: CGRectMake((self.view .frame .size .width - 200.0 ) / 2 , 10.0 , 200.0 , 40.0 )) self.view .addSubview (view) view.text = "缩放/淡入淡出" view.textAlignment = .Center view.adjustsFontSizeToFitWidth = true view.backgroundColor = UIColor.lightGrayColor () // let layer = view.layer // 开始动画 // 缩放 let scaleAnimate = CABasicAnimation(keyPath: "transform.scale" ) scaleAnimate.fromValue = 1.0 scaleAnimate.toValue = 1.5 scaleAnimate.autoreverses = true scaleAnimate.repeatCount = MAXFLOAT scaleAnimate.duration = 1.0 // 淡入淡出 let opaqueAnimate = CABasicAnimation(keyPath: "opacity" ) opaqueAnimate.fromValue = 0.1 opaqueAnimate.toValue = 1 opaqueAnimate.autoreverses = true opaqueAnimate.repeatCount = MAXFLOAT opaqueAnimate.duration = 1.0 layer.addAnimation (scaleAnimate, forKey: "scaleAnimate" ) layer.addAnimation (opaqueAnimate, forKey: "opacityAnimate" )
// 组合动画 let view3 = UILabel(frame: CGRectMake(10.0 , (currentView.frame .origin .y + currentView.frame .size .height + 10.0 ), 120.0 , 40.0 )) self.view .addSubview (view3) view3.text = "组合动画" view3.textAlignment = .Center view3.adjustsFontSizeToFitWidth = true view3.backgroundColor = UIColor.lightGrayColor () // let layer3 = view3.layer // CAAnimationGroup组合动画效果 let rotate: CABasicAnimation = CABasicAnimation() rotate.keyPath = "tranform.rotation" rotate.toValue = M_PI let scale: CABasicAnimation = CABasicAnimation() scale.keyPath = "transform.scale" scale.toValue = 0.0 let move: CABasicAnimation = CABasicAnimation() move.keyPath = "transform.translation" move.toValue = NSValue(CGPoint: CGPoint(x : 217 , y : 230 )) let animationGroup:CAAnimationGroup = CAAnimationGroup() animationGroup.animations = [rotate, scale, move] animationGroup.duration = 2.0 animationGroup.fillMode = kCAFillModeForwards animationGroup.removedOnCompletion = false animationGroup.repeatCount = MAXFLOAT // layer3.addAnimation (animationGroup, forKey: nil)
CAKeyframeAnimation关键帧动画 主要属性: keyPath : 要设置的属性 path : 路径 可用UIBezierPath(设置了path,将忽略values) duration : 动画时长 repeatCount : 重复次数 calculationMode : 动画计算方式 values:每一个关键帧(设置了path,将忽略values) removedOnCompletion:执行完之后不删除动画 fillMode:执行完之后保存最新的状态 delegate:代理
let view = UILabel(frame: CGRectMake((self.view .frame .size .width - 200.0 ) / 2 , 10.0 , 200.0 , 40.0 )) self.view .addSubview (view) view.text = "CAKeyframeAnimation动画" view.backgroundColor = UIColor.lightGrayColor () // let layer = view.layer // 位移 let keyAnimate = CAKeyframeAnimation(keyPath: "position" ) // 设定关键帧 let value0 = NSValue(CGPoint: layer.position ) let value1 = NSValue(CGPoint: CGPointMake(layer.position .x , layer.position .y + 200 )) let value2 = NSValue(CGPoint: CGPointMake(layer.position .x - 150 , layer.position .y + 200 )) let value3 = NSValue(CGPoint: CGPointMake(layer.position .x - 150 , layer.position .y )) let value4 = NSValue(CGPoint: layer.position ) // 速度曲线 let tf0 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) let tf1 = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) let tf2 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) let tf3 = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) keyAnimate.timingFunctions = [tf0, tf1, tf2, tf3] // 每段执行的时间 keyAnimate.keyTimes = [0.0 , 0.5 , 0.6 , 0.7 , 1 ] // keyAnimate.values = [value0, value1, value2, value3, value4] keyAnimate.autoreverses = false keyAnimate.repeatCount = 3 keyAnimate.duration = 6.0 // keyAnimate.delegate = self // layer.addAnimation (keyAnimate, forKey: "position" )
override func animationDidStart(anim: CAAnimation) {print("开始" ) }override func animationDidStop(anim: CAAnimation, finished flag: Bool) {print("结束" ) }
let view3 = UILabel(frame: CGRectMake(10.0 , (currentView.frame .origin .y + currentView.frame .size .height + 10.0 ), 60.0 , 60.0 )) self.view .addSubview (view3) view3.text = "抖动" view3.backgroundColor = UIColor.lightGrayColor () // let layer3 = view3.layer // 抖动 let animation3 = CAKeyframeAnimation() animation3.keyPath = "transform.rotation" // (-M_PI_4 /90.0 * 5 )表示-5 度 。 let value31 = NSValue(CGPoint: CGPointMake(CGFloat(-M_PI_4 / 90.0 * 5.0 ), 0.0 )) let value32 = NSValue(CGPoint: CGPointMake(CGFloat(M_PI_4 / 90.0 * 5.0 ), 0.0 )) let value33 = NSValue(CGPoint: CGPointMake(CGFloat(-M_PI_4 / 90.0 * 5.0 ), 0.0 )) animation3.values = [value31, value32, value33] animation3.removedOnCompletion = false animation3.fillMode = kCAFillModeForwards animation3.duration = 0.2 animation3.repeatCount = MAXFLOAT // layer3.addAnimation (animation3, forKey: nil)