前面iOS 开发动画 View Animation讲的都是基于 UIView 的系统封装的高级 API。CoreAnimation 是在 Layer层上操作添加动画,可以做出更复杂的动画。
UIView 和 CALayer 的区别:
(1) UIView 是继承自 UIResponse,可以处理响应事件,CALayer 是继承自 NSObject,只负责内容的创建和绘制。
(2) UIView 负责内容的管理,CALayer 负责内容的绘制。
(3) UIView 的位置属性frame
bounds
center
而 CALayer除了这些属性之外还有anchorPoint
position
(4) CALayer 可以实现 UIView 很多无法实现的功能
注意:CoreAnimation 的动画执行过程都是在后台执行的,不会阻塞主线程。
CABaseAnimation
常用的属性
animation.keyPath // 动画操作的属性
animation.toValue // 属性值的最终值
animation.duration // 动画执行的时间
animation.fillMode // 执行后的状态
animation.isRemovedOnCompletion // 动画执行后要不要删除
动画的类型
1.平移动画: position transform.translation.x transform.translation.y transform.translation.z
2.旋转动画: transform.rotation transform.rotation.x transform.rotation transform.rotation.y
3.缩放动画: bounds transform.scale transform.scale.x transform.scale.y
4.颜色动画:backgroundColor borderColor
5.淡入淡出:opacity
6.高级动画:(圆角)cornerRadius (边框) borderWidth (阴影)shadowOffse
CABaseAnimation选择其一 keyPath 作为例子
阴影动画
override func viewDidLoad() {
super.viewDidLoad()
redView.layer.shadowColor = UIColor.black.cgColor
redView.layer.shadowOpacity = 0.5
let animation = CABasicAnimation()
animation.keyPath = "shadowOffset"
animation.toValue = NSValue(cgPoint: CGPoint(x: 10, y: 10))
animation.duration = 2.0
animation.fillMode = kCAFillModeForwards
animation.isRemovedOnCompletion = false
redView.layer.add(animation, forKey: nil)
}
CAKeyframeAnimation
新增几个属性
path:运动的路线
values: 关键帧(如果设置了 path,values 是被忽略的)
keyTimes:为对应的关键帧指定的时间点,范围是0~1的
// 1.创建动画对象
CAKeyframeAnimation * anim = [CAKeyframeAnimation animation];
// 2.设置动画属性
anim.keyPath = @"position";
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, CGRectMake(100, 100, 200, 200));
anim.path = path;
CGPathRelease(path);
// 动画的执行节奏
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
anim.duration = 2.0f;
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
anim.delegate = self;
[self.redView.layer addAnimation:anim forKey:nil];
CASpringAnimation
新增属性
// 质量,影响视图运动时的惯性,mass越大运动时间越长
open var mass: CGFloat
// 弹簧钢度系数,取值0~100,默认取值100
open var stiffness: CGFloat
// 阻尼系数,影响反弹的次数,取值大于0,more取值10
open var damping: CGFloat
// 初始速度,默认为0
open var initialVelocity: CGFloat
// 获取反弹时的停顿时间,只读属性
open var settlingDuration: CFTimeInterval
let jump = CASpringAnimation(keyPath: "position.y")
jump.initialVelocity = 100.0
jump.mass = 10.0
jump.stiffness = 1500.0
jump.damping = 50.0
jump.fromValue = textField.layer.position.y + 1.0
jump.toValue = textField.layer.position.y
jump.duration = jump.settlingDuration
textField.layer.add(jump, forKey: nil)
转场动画 CATransition
UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
属性解析:
type:动画过渡类型
subtype:动画过渡方向
startProgress:动画起点(在整体动画的百分比)
endProgress:动画终点(在整体动画的百分比)
代码:
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic, assign) int index;
@end
@implementation ViewController
- (IBAction)prebtn:(id)sender {
self.index--;
if (self.index == -1) {
self.index = 8;
}
NSString * filename = [NSString stringWithFormat:@"%d.jpg", self.index + 1];
self.imageView.image = [UIImage imageNamed:filename];
CATransition * anim = [CATransition animation];
anim.type= @"cube";
anim.subtype = kCATransitionFromLeft;
anim.duration = 0.5;
[self.view.layer addAnimation:anim forKey:nil];
}
- (IBAction)nextbtn:(id)sender {
self.index++;
if (self.index == 9) {
self.index = 0;
}
NSString * filename = [NSString stringWithFormat:@"%d.jpg",self.index+1];
self.imageView.image = [UIImage imageNamed:filename];
CATransition * anim = [CATransition animation];
// 设置过渡类型
anim.type = @"cube";
// 设置过渡方向
anim.subtype = kCATransitionFromRight;
anim.duration = 0.5;
[self.view.layer addAnimation:anim forKey:nil];
}
9.gif
网友评论