ios 关于动画用法的总结
#
import
"FirstVC.h"
@implementation
FirstVC
/*
创建xib过程
1 创建xib(名字和类名相同)
2 文件拥有者为类名
3 和类的view连线
*/
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [
super
initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if
(self) {
// Custom initialization
}
return
self;
}
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (
void
)didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//UIView属性动画
- (IBAction)pressPropertyAnimation:(id)sender {
//1 准备动画
//参数1: 动画的作用, 用来区分多个动画, 参数二: 传递参数用 nil:OC中使用 NULL:C语言使用
[UIView beginAnimations:@
"改变大小"
context:NULL];
//在准备动画的时候可以设置动画的属性
[UIView setAnimationDuration:
2
];
//设置动画的持续时间
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:
@selector
(startAnimation)];
// [UIView setAnimationDelay:1];//动画延迟执行时间
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//动画的曲线
[UIView setAnimationRepeatCount:
20
];
//动画的重复次数
[UIView setAnimationRepeatAutoreverses:YES];
//动画往返执行, 必须设置动画的重复次数
//2 修改view的属性, 可以同时修改多个属性 注意:不是所有的属性都可以修改的(只有frame, center, bounds, backgroundColor, alpha, transform 可以修改)
self.changeView.frame = CGRectMake(
110
,
100
,
100
,
100
);
// self.changeView.backgroundColor = [UIColor brownColor];
self.changeView.backgroundColor = [UIColor colorWithRed:arc4random() %
256
/
255.0
green:arc4random() %
256
/
255.0
blue:arc4random() %
256
/
255.0
alpha:
0.5
];
//3 提交并执行动画
[UIView commitAnimations];
}
//UIView过度动画
- (IBAction)pressTranstionAnimation:(id)sender {
//1 准备动画
[UIView beginAnimations:@
"过度动画"
context:NULL];
[UIView setAnimationDuration:
5
];
[UIView setAnimationRepeatCount:
50
];
//2 设置过度样式
//参数1: 过度样式, 参数2: 指定那个View做动画, 参数3: 是否设置缓存
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.changeView cache:YES];
self.changeView.backgroundColor = [UIColor colorWithRed:arc4random() %
256
/
255.0
green:arc4random() %
256
/
255.0
blue:arc4random() %
256
/
255.0
alpha:
0.5
];
//3 提交并执行动画
[UIView commitAnimations];
}
//Block动画
- (IBAction)pressBlockAnimation:(id)sender {
//只有一行代码 Block动画实质是对UIView动画的封装
//参数1:动画时长 参数2:Block: 设置要修改的View属性
/*
[UIView animateWithDuration:2 animations:^{
self.changeView.backgroundColor = [UIColor orangeColor];
}];
*/
//第二种Block
/*
//参数1:动画时长 参数2:Block: 设置要修改的View属性 参数3: 动画完成时调用
[UIView animateWithDuration:2 animations:^{
self.changeView.backgroundColor = [UIColor orangeColor];
} completion:^(BOOL finished) {
//finished判断动画是否完成
if (finished) {
NSLog(@"finished");
}
}];
*/
//第三种Block
/*
[UIView animateWithDuration:2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
// 设置要修改的View属性
self.changeView.backgroundColor = [UIColor orangeColor];
} completion:^(BOOL finished) {
//finished判断动画是否完成
if (finished) {
NSLog(@"finished");
}
}];
*/
//对过度动画的封装
//参数1: 改变的View 参数2:动画时长 参数3:动画类型 参数4 Block: 设置要修改的View属性 参数5:完成后的操作
[UIView transitionWithView:self.changeView duration:
2
options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
self.changeView.backgroundColor = [UIColor orangeColor];
} completion:^(BOOL finished) {
//finished判断动画是否完成
if
(finished) {
NSLog(@
"finished"
);
}
}];
}
#pragma mark - AnimationDelegate
//动画将要开始时调用
- (
void
)animationWillStart:(NSString *)animationID context:(
void
*)context
{
NSLog(@
"start: %@, %@"
, animationID, context);
}
//动画结束时调用
- (
void
)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(
void
*)context
{
NSLog(@
"stop: %@, %@"
, animationID, context);
}
- (
void
)startAnimation
{
NSLog(@
"self"
);
}
#
import
"SecondVC.h"
@implementation
SecondVC
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
NSLog(@
"%@"
, NSStringFromCGRect(self.changeView.frame));
NSLog(@
"%f"
, CGRectGetWidth(self.changeView.frame));
//UIView和CALayer的关系
//UIView负责交互, frame以及显示CALayer
//CALayer负责渲染, 并且它是UIView的一个readonly属性
/*
self.changeView.layer.cornerRadius = 100;//设置圆角, 参数是内切圆的半径, 若想画一个圆, 前提是view必须是正方形, 参数应该是view边长的一半
self.changeView.layer.borderWidth = 1;//设置描边的宽度
self.changeView.layer.borderColor = [UIColor orangeColor].CGColor;//设置描边的颜色(UIView上的颜色使用的是UIColor, CALayer上使用的颜色是CGColor)
self.changeView.layer.shadowOffset = CGSizeMake(50, 100);//设置阴影的偏移量 width影响水平偏移(正右负左), height影响垂直偏移(正下负上)
self.changeView.layer.shadowColor = [UIColor grayColor].CGColor;//阴影的偏移的颜色
self.changeView.layer.shadowOpacity = 1;//阴影的不透明度, 取值范围(0 ~ 1), 默认是0, 就是透明的
*/
// CAAnimation抽象类, 使用必须要使用其具体的子类
// CAPropertyAnimation抽象子类, 需要子类化
// CABasicAnimation
// CAKeyframeAnimation
}
- (
void
)didReceiveMemoryWarning
{
[
super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (
void
)dealloc {
[_changeView release];
[
super
dealloc];
}
//CABasicAnimation基本动画 没有真正的修改属性值
- (IBAction)pressBasicAnimation:(id)sender {
//1 创建并指定要修改的属性
// KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size
// CALayer
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@
"bounds"
];
[basic setDuration:
2
];
//2 修改属性值
basic.fromValue = [NSValue valueWithCGRect:CGRectMake(
0
,
0
, self.changeView.bounds.size.width, self.changeView.bounds.size.height)];
basic.toValue = [NSValue valueWithCGRect:CGRectMake(
0
,
0
,
300
,
300
)];
// basic.byValue =
//3 添加动画
//key做区分动画用
[self.changeView.layer addAnimation:basic forKey:@
"changColor"
];
}
//CAKeyframeAnimation关键帧动画
- (IBAction)pressKeyFrameAnimation:(id)sender {
/*
//1 创建动画
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"bounds"];
[keyFrame setDuration:2];
//2 修改属性
keyFrame.values = @[[NSValue valueWithCGRect:CGRectMake(0, 0, self.changeView.bounds.size.width, self.changeView.bounds.size.height)], [NSValue valueWithCGRect:CGRectMake(0, 0, 250, 250)], [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)]];
// keyTimes:值代表了出现动画的时刻, 值得范围是0~1, 值必须是递增的, keyTimes和values是一一对应的
keyFrame.keyTimes = @[@(0.4), @(0.6), @(1)];
//3 添加动画
[self.changeView.layer addAnimation:keyFrame forKey:@"keyFrame"];
*/
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@
"backgroundColor"
];
[keyFrame setDuration:
10
];
keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];
//keyTimes中的第一个值是0, 不能修改
keyFrame.keyTimes = @[@(
0.3
), @(
0.5
), @(
0.6
), @(
0.7
), @(
0.9
)];
[self.changeView.layer addAnimation:keyFrame forKey:nil];
}
// CATransaction 过度动画
- (IBAction)pressTransition:(id)sender {
//1 创建
CATransition *transition = [CATransition animation];
[transition setDuration:
2
];
//2 设置过度样式
transition.type = kCATransitionReveal;
//控制样式
transition.subtype = kCATransitionFromTop;
//控制方向
//添加动画
[self.changeView.layer addAnimation:transition forKey:nil];
}
// CAAnimationGroup 组动画
- (IBAction)pressAnimationGroup:(id)sender {
//1 创建并指定要修改的属性
// KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size
// CALayer
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@
"bounds"
];
[basic setDuration:
2
];
//2 修改属性值
basic.fromValue = [NSValue valueWithCGRect:CGRectMake(
0
,
0
, self.changeView.bounds.size.width, self.changeView.bounds.size.height)];
basic.toValue = [NSValue valueWithCGRect:CGRectMake(
0
,
0
,
300
,
300
)];
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@
"backgroundColor"
];
[keyFrame setDuration:
5
];
keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];
//keyTimes中的第一个值是0, 不能修改
keyFrame.keyTimes = @[@(
0.3
), @(
0.5
), @(
0.6
), @(
0.7
), @(
0.9
)];
// 创建
//当group动画的时长 > 组中所有动画的最长时长, 动画的时长以组中最长的时长为准
//当group动画的时长 < 组中所有动画的最长时长, 动画的时长以group的时长为准
//最合适: group的时长 = 组中所有动画的最长时长
CAAnimationGroup *group = [CAAnimationGroup animation];
[group setDuration:
10
];
//设置组动画
group.animations = @[basic, keyFrame];
//添加动画
[self.changeView.layer addAnimation:group forKey:nil];
}
@end
ios 关于动画用法的总结的更多相关文章
- iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题
本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37 segmentfault-博客原文 http://segm ...
- iOS核心动画学习整理
最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...
- IOS 核心动画之CAKeyframeAnimation - iBaby
- IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...
- iOS各种动画效果
ios各种动画效果 最普通动画: //开始动画 [UIView beginAnimations:nil context:nil]; //设定动画持续时间 [UIView setAnimationDu ...
- IOS之动画
IOS之动画 15.1 动画介绍 15.2 Core Animation基础 15.3 隐式动画 15.4 显式动画 15.5 关键帧显式动画 15.6 UIView级别动画 15.1 动画介绍 ...
- IOS NSUserDefaults 讲解 用法
IOS NSUserDefaults 讲解 用法 NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults ...
- IOS 动画专题 --iOS核心动画
iOS开发系列--让你的应用“动”起来 --iOS核心动画 概览 通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看 ...
- ios 学习动画的套路 (一)
你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟~不知道从哪里下手去写!会连续的 ...
- Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画
转自:https://www.cnblogs.com/zamhown/p/6688369.html 大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画 ...
随机推荐
- 刷题总结——谈笑风生(主席树+dfs序的应用)
题目: Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同 ...
- cf550D Regular Bridge
Regular Bridge An undirected graph is called k-regular, if the degrees of all its vertices are equal ...
- Spoj-DRUIDEOI Fata7y Ya Warda!
Fata7y Ya Warda! Druid (AKA Amr Alaa El-Deen) and little EOIers have finished their training and the ...
- angularjs bootstrap 简介
1.angular特色 数据双向绑定 模块化 var myapp=angular.module... 控制器 myapp.controller(){} 2.bootstrap特色 栅格结构 cs ...
- 了解Chrome扩展程序开发--摘抄
了解Chrome扩展程序开发 2018-01-11 边城到此莫若 鸡蛋君说前端 首先,我尝试来用简单几句话描述一下Chrome扩展程序: Chrome扩展主要用于对浏览器功能的增强,它强调与浏览器相结 ...
- python--爬取http://www.kuaidaili.com/并保存为xls
代码如下: 复制在python3上先试试吧^_^ # -*- coding: utf-8 -*- """ Created on Mon Jun 12 13:27:59 2 ...
- 某考试 T2 sum
为什么其他人都是插值套插值啊,,,,就我是XJB做的吗2333 k次多项式的前缀和可以表示成k+1次多项式,用两次这个玩意就可以发现g可以表示成一个k+2次多项式. 然后我的做法是把g用拉格朗日插值+ ...
- 【Vue 学习系列 - 01】- 环境搭建(Win7)
1. 根据系统下载Node.js 下载地址:http://nodejs.cn/download 2. 安装Node.js 点击安装Node.js,在安装目录D:\Program Files\nodej ...
- mysql获取子父级节点
获取所有子节点 DROP FUNCTION IF EXISTS `F_Co29_GetAllChildrenIdsOfTaskevent`;DELIMITER //CREATE FUNCTION `F ...
- Javascript构造函数和原型
相信你已经知道了,Javascript函数也可以作为对象构造器.比如,为了模拟面向对象编程中的Class,可以用如下的代码 function Person(name){ this.name = nam ...