ios动画

一、动画的使用场景

iOS中的动画是指?些视图上的过渡效果,合理利?动画能提??户体验。

动画的分类

二、UIView动画

2.1 属性:

frame:视图框架

center:视图位置

bounds:视图??

backgroundColor:背景颜?

alpha:视图透明度

transform:视图转换

2.2 UIView动画的设置

?法名 作?

+ (void)setAnimationDuration:(NSTimeInterval)duration; 动画持续时间

+ (void)setAnimationDelay:(NSTimeInterval)delay; 动画开始前延时

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; 动画的速度曲线

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; 动画反转

+ (void)setAnimationRepeatCount:(float)repeatCount; 动画反转的次数

+ (void)setAnimationDelegate:(id)delegate; 设置动画的代理

+ (void)setAnimationWillStartSelector:(SEL)selector; 动画开始的代理?法

+ (void)setAnimationDidStopSelector:(SEL)selector; 动画结束的代理?法

+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; 动画从当前状态继续执?

三、CGAffineTransform2D仿射变换

CGAffineTransform是结构体,表??个矩阵,?于映射视图变 换。 缩放、旋转、偏移是仿射变换?持的最常?的操作。 缩放、缩放、偏移区分“基于上?次”和“基于初始” 。

3.1 CGAffineTransfrom的API

CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d,CGFloat tx, CGFloat ty) 通过设置矩阵值进?变换

CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 放?缩?(基于初始)

CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle) 旋转(基于初始)

CGAffineTransform CGAffineTransformScale(CGAffineTransform t,CGFloat sx, CGFloat sy) 放?缩?(基于前?次变化)

CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,CGFloat angle) 旋转(基于前?次变化)

3.2 Demo

#pragma mark -- 首尾动画 --
/*
 语法形式:
 [UIView beginAnimations:动画名 context:传给代理所执行的方法后面的参数];
 
 [UIView commitAnimations];
 
 */
- (IBAction)didClickFirstBtn:(UIButton *)sender {
    [UIView beginAnimations:@"第一个UIView动画" context:nil];
    //动画和视图的属性设置
    //1.设置动画的执行时间
    [UIView setAnimationDuration:.1];
    //2.设置动画重复次数
    [UIView setAnimationRepeatCount:2];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    //从当前状态执行
    [UIView setAnimationBeginsFromCurrentState:YES];
//    [UIView setAnimationRepeatAutoreverses:YES];
    //设置视图相关属性
//    CGRect frame = self.view.frame;
//    frame.size.width /= 50;
//    frame.size.height /= 50;
//    self.myView.frame = frame;
    self.myView.transform = CGAffineTransformRotate(self.myView.transform, M_PI);
//    self.myView.transform = CGAffineTransformMakeScale(0.5, 0.5);
    self.myView.transform = CGAffineTransformScale(self.myView.transform, 2, 2);
    [UIView commitAnimations];
   
}

#pragma mark -- BLOCK动画块 --
- (IBAction)didClickSecondBtn:(id)sender {
    __block ViewController *VC = self;
    [UIView animateWithDuration:0.5 animations:^{
        //对动画和视图属性进行设置
//        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationRepeatCount:1.0];
        //视图设置
        VC.myView.transform = CGAffineTransformRotate(VC.myView.transform, M_PI_4);
        VC.myView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
       
    } completion:^(BOOL finished) {
        //动画结束之后
        [UIView animateWithDuration:0.5 animations:^{
            [UIView setAnimationRepeatCount:1];
            VC.myView.transform = CGAffineTransformScale(VC.myView.transform, 0.5, 0.5);
        } completion:^(BOOL finished) {
           
        }];
    }];
}

#pragma mark -- UIView的转场动画 --
- (IBAction)transitionAnimation:(id)sender {
    //1.view自身的转场动画
//    [UIView transitionWithView:self.myView duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{
//        [UIView setAnimationRepeatCount:2];
//        self.myView.backgroundColor = [UIColor redColor];
//    } completion:^(BOOL finished) {
//       
//    }];
    //2.两个view之间的转场动画
    UIView *toView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    toView.backgroundColor = [UIColor cyanColor];
    [UIView transitionFromView:_myView toView:toView duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve completion:nil];
    //将self.myView从父视图上移除(销毁),同时添加toView

}

四、CALayer

4.1 UIView和CALayer的区别和联系

CALayer负责绘制,提供UIView 需要展?的内容。不能交互。是UIView的?个readonly属性。

UIView负责交互,显?CALayer绘制的内容。

4.2 CALayer的常?属性

属性 作?

CornerRadius 圆?

ShadowColor 阴影颜?

ShadowOffset 阴影偏移距离

ShadowRadius 阴影模糊程度

ShadowOpacity 阴影透明度

BorderWidth 描边粗细

BorderColor 描边颜?

anchorPoint 锚点

position 位置信息

transfrom 使CALayer产?3D空间内的平移、缩放、旋转等变化

4.3 anchorPoint和position

4.4 Demo

- (void)viewDidLoad {
    [super viewDidLoad];
    _imgView.backgroundColor = [UIColor redColor];
    _imgView.layer.cornerRadius = 30;
//    _imgView.layer.masksToBounds = YES;   //如果设置masksToBounds=YES,设置阴影无效
    _imgView.layer.anchorPoint = CGPointMake(0.5, 1);
    _imgView.layer.shadowColor = [UIColor lightGrayColor].CGColor;
    _imgView.layer.shadowOpacity = 1;
    _imgView.layer.shadowOffset = CGSizeMake(10, 10);
    _imgView.layer.shadowRadius = 1;
   
    _myView.layer.cornerRadius = 50;
    _myView.layer.shadowColor = [UIColor redColor].CGColor;
    _myView.layer.shadowOpacity = 1;
    _myView.layer.shadowOffset = CGSizeMake(10, 10);
   
#pragma mark -- 自定义CALayer --
    [self customLayer];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)customLayer
{
    CALayer *myLayer = [CALayer layer];
    //设置其位置和大小
    myLayer.bounds = CGRectMake(0, 0, 50, 50);
    myLayer.backgroundColor = [UIColor yellowColor].CGColor;
    //设置锚点
    myLayer.anchorPoint = CGPointMake(0, 0);
//    设置position(定位点,默认是(0,0)).锚点和position始终重合
    myLayer.position = CGPointMake(50, 50);
    //添加到父图层
    [self.view.layer addSublayer:myLayer];
}
- (IBAction)didClickBasic:(id)sender {
    /*
    //1.设置动画对象
    CABasicAnimation *basicAnimation = [CABasicAnimation animation];
    //2.告诉系统要执行的动画,影响的是哪个属性
    basicAnimation.keyPath = @"position";
    //3.设置通过动画,将layer从哪移动到哪
    basicAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    basicAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 500)];
    //取消回到原位置
    basicAnimation.removedOnCompletion = NO;
    //设置保存动画的最新状态
    basicAnimation.fillMode = kCAFillModeForwards;
   
    basicAnimation.duration = 3.0;
   
    [self.imgView.layer addAnimation:basicAnimation forKey:@"basic"];
     */
   
    //实现旋转
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform"];
    basic.duration = 2.0;
    basic.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4*4, 1, 1, 1)];
    basic.removedOnCompletion = NO;
    basic.fillMode = kCAFillModeForwards;
    [self.imgView.layer addAnimation:basic forKey:@"basic"];
    //移除动画
//    [self.imgView.layer removeAnimationForKey:@"basic"];
   
}
#pragma mark -- IBActions -------
#pragma mark -- 帧动画 --
- (IBAction)didClickKeyFrame:(id)sender {
    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    //设置动画时间
    keyFrame.duration = 0.1;
    //设置imageView的抖动角度
    //角度转换为弧度: 度数/180*M_PI
    keyFrame.values = @[@(-4.0/180*M_PI),@(4.0/180*M_PI)];
    keyFrame.repeatCount = 100;
    [self.imgView.layer addAnimation:keyFrame forKey:@"keyFrame"];
}

#pragma mark -- CATransition转场动画 --
- (IBAction)didClickTransition:(id)sender {
    //属性:
    //type:设置动画过渡类型
    //subType:动画过度的方向
    //startProgress:动画起点
    //endProgress:动画终点
    self.index++;
    self.index = _index%19 +1;
    self.imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg",self.index]];
   
    CATransition *transition = [CATransition animation];
    transition.type = @"cube";
    transition.subtype = kCATransitionFromLeft;
    transition.duration = 2;
    transition.repeatCount = 10;
//    transition.startProgress = 0;
//    transition.endProgress = 1;

[self.imgView.layer addAnimation:transition forKey:@"transition"];

}

五、CAAnimation动画

CAAnimation是抽象类,通常使?它的?类实现动画效果。所有CAAnimation及其?类的对象都添加在View的layer上,例如: [view.layer addAnimation:animation forKey:nil];

5.1 给layer添加/移除CALayer动画

- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key;

- (void)removeAnimationForKey:(NSString *)key;

- (void)removeAllAnimations;

5.2 CAAnimation相关?类

CAPropertyAnimation也是?个抽象类 通常我们都使?它的两个?类:CABasicAnimation和 CAKeyFrameAnimation

5.2.1 CABasicAnimation

作?:基本layer动画,通过设定初始和结束值执?动画

+ (id)animationWithKeyPath:(NSString *)path; 系统提供的构造器?法

@property(copy) NSString *keyPath; 只能填写CALayer中能够做

动画的属性名

@property(retain) id fromValue; 起始值

@property(retain) id toValue; 结束值

@property(retain) id byValue; 相对值

5.2.2 CAKeyFrameAnimation

作?:关键帧动画,可以让你的view的layer按照预定轨迹做动画

?法名/属性名 作?

+ (id)animationWithKeyPath:(NSString *)path; 系统提供的构造器?法

@property CGPathRef path; 通过制定?个??定义的path来让某?个物体按照

这个路径进?动画

@property(copy) NSArray *values; ?个数组,提供了?组关键帧的值, 当使?path的

时候 values的值?动被忽略。

@property(copy) NSArray *keyTimes; ?个数组,设置每?帧的时间,其成员必须是

NSNumber。设置详情查看API。

@property(copy) NSString *rotationMode; 设定关键帧中间的值是如何计算

5.3 CAAnimaitionGroup

CAAnimationGroup只有?个数组属性,可以添加多个CAAnimation?起执?

5.3.1 CATrasition

作?:layer的过渡动画

有两个主要属性:type(设置过渡动画的效果)和subType(设置过渡动画的?向)

5.4 DEMO

- (IBAction)didGroupAnimation:(id)sender {

// 平移动画
    CABasicAnimation *a1 = [CABasicAnimation animation];
    a1.keyPath = @"transform.translation.y";
    a1.toValue = @(100);
    // 缩放动画
    CABasicAnimation *a2 = [CABasicAnimation animation];
    a2.keyPath = @"transform.scale";
    a2.toValue = @(0.0);
    // 旋转动画
    CABasicAnimation *a3 = [CABasicAnimation animation];
    a3.keyPath = @"transform.rotation";
    a3.toValue = @(M_PI_2);
   
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = @[a1, a2, a3];
    group.fillMode = kCAFillModeForwards;
//    group.removedOnCompletion = NO;

[self.imgView.layer addAnimation:group forKey:@"group"];

}

时间: 2024-10-12 17:39:37

ios动画的相关文章

如何解决IOS 动画中 Autolayout 与View Transforms的冲突

IOS 的动画放大与缩小,并非按照找它的中心点放大和缩小,而是左上角 .我分析了下原来是Autolayout 与View Transforms的冲突造成的. - (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option { // first reduce the view to 1/100th of its original dimen

iOS动画开发之一——UIViewAnimation动画的使用

iOS动画开发之一--UIViewAnimation动画的使用 一.简介 一款APP的成功与否,除了完善的功能外,用户体验也占有极大的比重,动画的合理运用,可以很好的增强用户体验.iOS开发中,常用的动画处理有UIView动画编程和核心动画编程,其中UIView动画使用简便,开发中应用十分广泛.这篇博客,主要讨论UIView的动画使用. 二.UIView动画的几个方法 + (void)animateWithDuration:(NSTimeInterval)duration animations:

iOS动画的要素

1)iOS动画的模型:三层树模型: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html#//apple_ref/doc/uid/TP40004514-CH2-SW12 Layer Trees Reflect Different Aspects of the Animati

iOS动画浅汇

转自:http://www.cocoachina.com/ios/20160311/15660.html 在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通过步骤分解后本质上不过是一个个简单的动画实现.本文就个人搜集的一些动画相关的理论和实践知识做个小结,不足之处请勿见怪. 理论 UIview VS UIlayer UI

iOS 动画Animation-4-5: CALayer子类:CATransformLayer

首先说明:这是一系列文章,参考本专题下其他的文章有助于你对本文的理解. 今天周六,希望大家都有一个愉快的周末. 今天来讲解一下CATransformLayer:CATransformLayer是一个专门用来创建三维视图的一个layer,也可以说是多个layer的集合.他没有多余的API,可以这么说,他只是承载了子layer. 下面就看一个例子,通过例子来讲解. 国际惯例先上图: 图就是这样的纯手工打造. 先创建一个CATransformLayer对象: var transformLayer =

iOS动画浅汇(转)

转自:http://www.cocoachina.com/ios/20160311/15660.html 在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通过步骤分解后本质上不过是一个个简单的动画实现.本文就个人搜集的一些动画相关的理论和实践知识做个小结,不足之处请勿见怪. 理论 UIview VS UIlayer UI

iOS 动画初步

iOS 动画初步 1. CALayer的使用 (图层) 属于QuartzCore.framework 框架 跨平台 我们在开发中使用的UIKit.framework里面的控件之所以可以看见,主要是由于他拥有了CALayer. 1 //------------------------------------------------------------------------- 2 // 图层 部分属性 3 4 // shadow 是否透明 5 self.myView.layer.shadowO

IOS动画总结

IOS动画总结 http://blog.sina.com.cn/s/blog_611b9d9d01015dkm.html (2012-06-01 14:50:32) 转载▼ 标签: 杂谈 分类: IOS 一.基本方式:使用UIView类的UIViewAnimation扩展 + (void)beginAnimations:(NSString *)animationID context:(void *)context; // 开始准备动画+ (void)commitAnimations; // 运行

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

iOS动画1 — UIView动画

iOS动画1 — UIView动画 iOS动画基础是Core Animation核心动画.Core Animation是iOS平台上负责图形渲染与动画的基础设施.由于核心动画的实现比较复杂,苹果提供了实现简单动画的接口—UIView动画.UIView动画封装在UIView的Category中,主要实现一些简单和常用的动画.UIView动画是对核心动画进行了一层封装,所以最终动画还是通过Core Animation的接口实现. 主要的动画效果都可以通过UIView动画和Core Animation