IOS CoreAnimation

@property (weak, nonatomic) IBOutlet UIView *redView;
@property (weak, nonatomic) IBOutlet UILabel *label;

#pragma mark - CoreAnimation
//基础动画
- (IBAction)CABasicAnimation:(UIButton *)sender {
    //参数需要是layer的属性,或者是属性的属性的名字
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"position.x"];
    basic.fromValue = @100;
    basic.toValue = @250;
    basic.duration = 3;
    basic.repeatCount = 1;
    //需要手动改变位置,(如果需要改变position的真实位置)
    //self.redView.layer.position = CGPointMake(150, 200);
    //key,标识
    [self.redView.layer addAnimation:basic forKey:nil];
}

//关键帧动画
- (IBAction)keyFrameAnimation:(UIButton *)sender {

    CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    CGPoint point0 = CGPointMake(100, 100);
    CGPoint point1 = CGPointMake(100, 200);
    CGPoint point2 = CGPointMake(200, 200);
    CGPoint point3 = CGPointMake(200, 300);
    CGPoint point4 = CGPointMake(150, 300);
    CGPoint point5 = CGPointMake(175, 250);
    CGPoint point6 = CGPointMake(175, 100);

    NSValue *value1 = [NSValue valueWithCGPoint:point0];
    NSValue *value2 = [NSValue valueWithCGPoint:point1];
    NSValue *value3 = [NSValue valueWithCGPoint:point2];
    NSValue *value4 = [NSValue valueWithCGPoint:point3];
    NSValue *value5 = [NSValue valueWithCGPoint:point4];
    NSValue *value6 = [NSValue valueWithCGPoint:point5];
    NSValue *value7 = [NSValue valueWithCGPoint:point6];

    //根据一组点来创建动画
    keyFrameAnimation.values = @[value1, value2, value3, value4, value5, value6, value7, value1];
    keyFrameAnimation.duration = 10;
    [self.redView.layer addAnimation:keyFrameAnimation forKey:nil];
}

/*
 *专场动画
 *pageCurl            向上翻一页
 *pageUnCurl          向下翻一页
 *rippleEffect        滴水效果
 *suckEffect          收缩效果,如一块布被抽走
 *cube                立方体效果
 *oglFlip             上下翻转效果
 */
- (IBAction)transitionAnimation:(UIButton *)sender {

    CATransition *transition = [CATransition animation];
    transition.type = @"rippleEffect";  //动画过渡类型
    transition.subtype = kCATransitionFromLeft; //动画过度方向
    transition.repeatCount = HUGE_VALL; //动画重复次数,最大次数
    transition.duration = 2;    //动画持续时间
    [self.redView.layer addAnimation:transition forKey:nil];
}

// 过度动画, 转场动画
- (IBAction)transitionAnimation1:(UIButton *)sender {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2];
    // 第一个参数: 转场动画的类型
    // 第二个参数: 给哪个对象添加转场动画
    // 第三个参数: 缓存设置(YES执行效率更高)
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
    self.label.text = @"熊大熊二的故事";
    [UIView commitAnimations];
}

//CAAnimationGroup。组动画实际上就是可以将上面的几种动画类型随意组合添加到一个对象上。
- (IBAction)groupAnimation:(UIButton *)sender {
    //创建一个缩放动画
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    basic.fromValue = @1;
    basic.toValue = @0.75;
    //创建一个关键帧动画,从一个位置到另一个位置
    CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    CGPoint point1 = CGPointMake(100, 100);
    CGPoint point2 = CGPointMake(300, 300);
    NSValue *value1 = [NSValue valueWithCGPoint:point1];
    NSValue *value2 = [NSValue valueWithCGPoint:point2];
    keyFrameAnimation.values = @[value1, value2];
    //创建一个动画组
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.duration = 4;
    group.repeatCount = 3;
    //将上面的两种动画添加到动画组中,动画将同步执行
    [group setAnimations:@[basic,keyFrameAnimation]];
    //下面的代码会最终改变对象的位置,否则对象在动画完成后会回到初始位置
    self.redView.layer.position = CGPointMake(300, 300);
    //添加动画组
    [self.redView.layer addAnimation:group forKey:nil];
}

/*
 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
 */
- (IBAction)springAnimation:(UIButton *)sender {

    CASpringAnimation *spring = [CASpringAnimation animationWithKeyPath:@"transform.rotation"];
    //质量越大,惯性越大
    spring.mass = 1;
    //阻尼系数,越大停止的越快
    spring.damping = 0.2;
    spring.fromValue = @0.2;//transform.rotation的初始值
    spring.toValue = @0.75;//transform.rotation的结束值
    spring.repeatCount = 1;
    spring.autoreverses = YES;//自动回弹
    //初始速度
    spring.initialVelocity = 5;
    spring.duration = spring.settlingDuration;
    [self.redView.layer addAnimation:spring forKey:@"spring"];
}

// 弹簧动画
- (IBAction)sprintAnimation:(UIButton *)sender {
    // 1. 动画时长
    // 2. 延迟时间
    // 3. 阻尼系数, 越大, 弹簧形变越小
    // 4. 速度
    // 5. 动画类型选项
    [UIView animateWithDuration:2 delay:0 usingSpringWithDamping:0.1 initialSpringVelocity:10 options:UIViewAnimationOptionCurveLinear animations:^{
        CGPoint point = self.redView.center;
        point.y += 260;
        self.redView.center = point;

    } completion:^(BOOL finished) {
        NSLog(@"动画结束");
    }];
}

#pragma mark
#pragma mark - UIViewAnimation
- (IBAction)changeFrame:(UIButton *)sender {
    //第一个参数,动画标示
    [UIView beginAnimations:@"changeFrame" context:nil];
    //设置动画次数
    [UIView setAnimationRepeatCount:100];
    //设置动画时长
    [UIView setAnimationDuration:1];
    //设置动画速率
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    CGRect frame = self.redView.frame;
    frame.origin.y = 200;
    //改变frame,y值
    self.redView.frame = frame;
    //开始动画
    [UIView commitAnimations];
}

//缩放动画
- (IBAction)scaleButtonAction:(UIButton *)sender {

    [UIView beginAnimations:@"UIView" context:nil];
    self.redView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.5, 1.5);
}

// 旋转
- (IBAction)rotateButtonAction:(UIButton *)sender {
    [UIView beginAnimations:nil context:nil];
    // 第一个参数: 以谁为基准进行旋转
    // 第二个参数: 旋转的弧度
    // CGAffineTransformIdentity 原始形变
    [UIView setAnimationDuration:1];
    self.redView.transform = CGAffineTransformRotate(self.redView.transform, -M_PI / 180 * 30);
    [UIView commitAnimations];
}

// 简单block动画
- (IBAction)simpleBlock:(UIButton *)sender{
    [UIView animateWithDuration:2 animations:^{
        CGPoint point = self.redView.center;
        point.y += 100;
        self.redView.center = point;
    } completion:^(BOOL finished) {
        NSLog(@"动画结束");
        [UIView animateWithDuration:2 animations:^{
            CGPoint point = self.redView.center;
            point.y -= 100;
            self.redView.center = point;
        } completion:nil];

    }];
}

// 复杂的block
- (IBAction)complexBlock:(UIButton *)sender {
    [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.redView.transform = CGAffineTransformRotate(self.redView.transform, M_PI / 180 * 90);
    } completion:^(BOOL finished) {
        // 还原到初始形变
        //        self.planeImageView.transform = CGAffineTransformIdentity;
    }];
}

 代码收集来自: http://www.cnblogs.com/zzuliliu/p/5468732.html

时间: 2024-12-29 06:57:52

IOS CoreAnimation的相关文章

iOS CoreAnimation 基础动画CABasicAnimation

本文参考:http://www.cnblogs.com/kenshincui/p/3972100.html#autoid-3-0-0总结的: Core Animation * iOS 核心动画的实现 CoreAnimation (包含在Quartz Core 框架中), 在iOS核心动画分为几类(基础动画, 关键帧动画, 动画组, 转场动画, ) CAAnimation : 核心动画的基础类, 不能直接用, 负责动画运行时间吗速度的控制, 实现了CAMediaTiming协议 CAPropert

iOS CoreAnimation详解(一) 有关Layer的动画

以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 本文主要从CoreAnimation的Layer角度来讲解动画,我想从CALayer的角度更好理解,后续还会有第二篇从UIKIt的UIView角度来讲解动画,第三篇讲解UIDynamicAnimati

iOS CoreAnimation专题——原理篇(四)动画时间控制

前言 CAMediaTiming协议 可视化的CAMediaTiming协议 beginTime fillMode autoreverses repeatCount repeatDuration speed 动画速度的分层表示 CAMediaTiming协议的其他实现 timeOffset 更多的动画时间可视化插图 控制动画时间 Slider 关于fillMode和Ease的补充 fillMode Ease 后记 前言 这一章虽然叫做动画时间控制,然而我们并不会去深入到一般的动画时间中,我们将讨

iOS CoreAnimation 逐帧动画 CADisplayLink

本文参考:http://www.cnblogs.com/kenshincui/p/3972100.html#autoid-3-0-0总结的: 逐帧动画 CADisplayLink 动画效果: 结合runloop 实现 每次屏幕刷新都会执行此方法(每秒接近60此) 在此方法更新图片, 或者更新layer的某个状态实现动画效果,感觉不到动画的停滞效果 当然UIImageView通过设置animationImages的属性, 然后startAnimating方法播放这组照片,也 可以达到逐帧的动画效果

iOS CoreAnimation剖析

零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可以用来和别人交流的.抽象比形象难于理解,但比形象通用.其实数学中经常碰到抽象和形象的概念,比如有一系列离散的点,这是形象;通过这些点我们拟合出一条曲线,得到其函数,函数是抽象的;然后通过这个函数我们可以得到更多的点,这又回到了形象上.所以学习任何知识不能仅仅停留在会用了,而要上升一个层次,去学习研究

iOS CoreAnimation(核心动画二)

CATransition :转场动画  翻转动画 @interface ViewController () - (IBAction)previous:(UIButton *)sender; - (IBAction)next:(UIButton *)sender; @property (strong, nonatomic) IBOutlet UIImageView *iconView; @property(nonatomic,assign)int index;//当前图片的索引 @property

iOS CoreAnimation 转场动画 CATransition

本文参考:http://www.cnblogs.com/kenshincui/p/3972100.html#autoid-3-0-0总结的: 效果: 转场动画就是从一个场景以动画的形式过渡到另一个场景.转场动画的使用一般分为以下几个步骤: 1.创建转场动画 CATransition 2.设置转场类型transtion.type.子类型transtion.subtype(可选)及其他属性 3.设置转场后的新视图并添加动画到图层 下表列出了常用的转场类型(注意私有API是苹果官方没有公开的动画类型,

iOS围绕某点缩放或旋转的AnchorPoint的设定

经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点. 这个问题首先要清晰的知道,iOS各个view的层次关系.特别是,要清除的知道,当前view的frame与superView的bounds是一个坐标系. 具体来讲,AnchorPoint 是iOS CoreAnimation层的事物.图层的anchorPoint属性是一个CGPoint值,它指定了一个基于图层bounds的符合位置坐标系的位置.Anchor point指定了bounds相

《Objective-C Runtime分析(三)-objc_msgSend》

本系列主要参考资料: Objective-C Runtime ReferenceObjective-C Runtime Programming Guide涉及主要文件:objc/message.h,objc/objc-api.h,objc/objc.h,objc/runtime.h特酷吧[tekuba.net]采用"署名-非商业用途-保持一致"的创作共用协议,使用本文内容请遵循该协议 Objective-C Runtime是Objective-C的基础内容,理解了Objective-C