iOS简单动画
知识架构
- CALayer 图层类
- CABasicAnimation 基础动画
- CAKeyFrameAnimation 帧动画
- CATransition 转场动画
- CAAnimationGroup 动画组
- layer的基本概念
其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(CALyer对象),通过UIView的layer属性可以访问这个层。
- 基本属性
Bounds;position;frame;backgroundColor; opacity;cornerRadius;borderWidth; borderColor;shadowOffset; shadowColor; shadowOpacity;
我写了一些简单的demo,大家可以看看.......
//
// ViewController.m
// 简单的动画
//
// Created by 李盼盼 on 16/5/16.
// Copyright © 2016年 李盼盼. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) CALayer *subLayer;
@property (strong, nonatomic) UIView *redView;
@property (strong, nonatomic) CALayer *subLayer2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (assign, nonatomic) NSInteger currentIndex;
@end
@implementation ViewController
- (void)viewDidLoad {
self.view.backgroundColor = [UIColor colorWithRed:234/255.0f green:234/255.0f blue:234/255.0f alpha:1];
[super viewDidLoad];
// 行走的方块
_subLayer = [[CALayer alloc]init];
_subLayer.frame = CGRectMake(50, 50, 50, 50);
_subLayer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:_subLayer];
// 旋转放大的方块
_redView = [[UIView alloc]initWithFrame:CGRectMake(200, 100, 50, 50)];
_redView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:_redView];
// 慢慢放大的方块
_subLayer2 = [[CALayer alloc]init];
_subLayer2.frame = CGRectMake(50, 250, 50, 50);
_subLayer2.backgroundColor = [UIColor grayColor].CGColor;
[self.view.layer addSublayer:_subLayer2];
// 仿真翻页
_imageView.image = [UIImage imageNamed:@"a0.jpg"];
_currentIndex = 0;
}
#pragma mark ---- 上一张
- (IBAction)Last:(UIButton *)sender {
if (_currentIndex == 0) {
_currentIndex = 12;
}else{
_currentIndex--;
}
_imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"a%ld.jpg",_currentIndex]];
// 转场动画
CATransition *anim = [CATransition animation];
// 过度类型
anim.type = @"pageUnCurl";
// 动画过渡方向
anim.subtype = @"fromTop";
anim.duration = 0.8;
[_imageView.layer addAnimation:anim forKey:nil];
}
#pragma mark ---- 下一张
- (IBAction)next:(UIButton *)sender {
if (_currentIndex == 12) {
_currentIndex = 0;
}else{
_currentIndex++;
}
_imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"a%ld.jpg",_currentIndex]];
CATransition *anim = [CATransition animation];
anim.type = @"pageCurl";
anim.subtype = kCATransitionFromBottom;
anim.duration = 0.8;
[_imageView.layer addAnimation:anim forKey:nil];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
#pragma mark ---- 旋转放大的动画
CABasicAnimation *rotationAnim = [CABasicAnimation animation];
// rotationAnim.duration = 2;
rotationAnim.keyPath = @"transform.rotation.z";
rotationAnim.toValue = @(3.14);
rotationAnim.repeatCount = MAXFLOAT;
CABasicAnimation *scaleAnim = [CABasicAnimation animation];
scaleAnim.duration = 2;
scaleAnim.keyPath = @"transform";
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 2, 0)];
scaleAnim.repeatCount = MAXFLOAT;
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[rotationAnim,scaleAnim];
group.duration = 5;
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
[_redView.layer addAnimation:group forKey:nil];
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
#pragma mark ---- 行走的方块
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.duration = 5.0;
NSValue *value = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(50, 100)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
anim.values = @[value,value1,value2,value3,value4,value5];
// 设置动画的执行节奏
// kCAMediaTimingFunctionEaseInEaseOut:开始较慢,中间会加速,结束会减速
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[self.subLayer addAnimation:anim forKey:nil];
#pragma mark ---- 慢慢放大的方块
CABasicAnimation *anim1 = [CABasicAnimation animation];
// 动画执行是我时候修改属性
anim1.keyPath = @"bounds";
// 起始值
// anim1.fromValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 50, 50)];
// 目标值
anim1.toValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 100, 100)];
anim1.delegate = self;
anim1.duration = 5;
[_subLayer2 addAnimation:anim1 forKey:@"animation"];
/**不删除动画,同时保存动画最终效果**/
// 动画结束后自动删除动画
anim.removedOnCompletion = NO;
// 默认保存原来的样式:设置为使用最新的样式
anim.fillMode = kCAFillModeForwards;
}
- (IBAction)removeAnim:(UIButton *)sender {
[_subLayer2 removeAnimationForKey:@"animation"];
}
#pragma mark ---- 动画的代理
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"%s",__func__);
}
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
NSLog(@"%s",__func__);
}
@end
效果如下:
iOS简单动画的更多相关文章
- IOS 简单动画 首尾式动画
首尾式动画 首尾式动画即通过实现控件由初始状态到结束状态的过程.(主要表现在控件的Frame 透明度 ) // // ViewController.m // CX 简单动画 // // Created ...
- iOS 简单动画 序列帧动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"旭宝爱吃 ...
- iOS 简单动画 block动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ UIView * view = [ ...
- iOS简单动画效果:闪烁、移动、旋转、路径、组合
#define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...
- iOS CAReplicatorLayer 简单动画
代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...
- iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题
本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37 segmentfault-博客原文 http://segm ...
- IOS 核心动画之CAKeyframeAnimation - iBaby
- IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...
- Swift 实现iOS Animation动画教程
这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...
- iOS 开发--动画
在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细 ...
随机推荐
- C# XMPP客户端与openfire通信(Matrix Xmpp 授权破解教程)
如此著名的XMPP , 居然试过jabber-net, agsXmpp,matrix Xmpp, 无数多个例子, 居然没有一个能实现最简单的 发消息.收消息功能.好无语. 最后还是决定从商业产品 Ma ...
- UIPickerView理解
- 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 【emWin】例程四:显示文本
实验指导书及代码包下载: http://pan.baidu.com/s/1jHOYdqm
- java 性能优化(代码优化)
参考博文: java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- JDBC的使用(一):引用外部jar;代码链接数据库
一:引用外部jar 1.首先不jar文件放到项目下: 2.在Eclipse中,右键相应的项目--构建路径--配置构建路径--库--添加外部jar:选中-打开-应用-确定. 二:代码链接数据库 1.加载 ...
- Nodejs:precss模块 & autoprefixer模块
模块precss:可以通过他管理文件系统,文件的写入,删除等操作 模块autoprefixer: autoprefixer可以对sass处理过后的css再处理,解析CSS文件并且添加浏览器前缀到CSS ...
- Spring Data JPA
转自: http://www.cnblogs.com/WangJinYang/p/4257383.html Spring 框架对 JPA 的支持 Spring 框架对 JPA 提供的支持主要体现在如下 ...
- 远程连接服务器for Linux
远程连接Linux云服务器-命令行模式 1.远程连接工具.目前Linux远程连接工具有很多种,您可以选择顺手的工具使用.下面使用的是名为Putty的Linux远程连接工具.该工具是免费的,且不需要安装 ...
- Java web学习filter (1)
一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...