iOS之UIView动画_oc uiview animate 关键帧-程序员宅基地

技术标签: app store  动画  ios  uiview  iOS学习  

UIView动画

概述

在AppStore中的应用越来越重视动画效果的使用,一个良好动画效果可以让两个状态之间平滑地过度,也可以利用动画吸引住用户的眼球,在UIView类中共有三个类目(Category)用于实现动画功能,分为UIViewAnimation、UIViewAnimationWithBlocks以及UIViewKeyframeAnimations,他们是Apple对核心动画(Core Animation)的封装,可以让我们不进行任何绘画等复杂操作的前提下实现大部分动画需求

UIView动画的用处

UIView类中提供的动画功能,允许我们实现如下动画需求

  • 动态修改”可动画属性”
    • frame(位置及大小)
    • bounds(大小)
    • center(中心点位置)
    • transform(形变)
    • alpha(透明度)
    • backgroundColor(背景颜色)
    • contentStretch(可拉伸区域,从iOS6开始被废弃)
  • 提供转场动画效果
    • 修改已存在视图的子视图(也可以修改自身)
    • 在视图层级中用一个视图替换另一个视图(Block动画提供)
本文中样例素材

在介绍UIView动画的过程中,我们会使用一个UIImageView图片为例,对各动画效果进行演示

@property (nonatomic, strong) UIImageView *demoImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.demoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, [[UIScreen mainScreen] bounds].size.width-40, [[UIScreen mainScreen] bounds].size.height-40)];
    self.demoImageView.image = [UIImage imageNamed:@"old"];
    [self.view addSubview:self.demoImageView];
}

UIViewAnimation

Apple自iOS2开始提供了若干UIView的类方法来实现动画功能,Apple建议从iOS4系统开始尽量使用Block方式来实现动画功能,因此我们以后在开发中应该遵从Apple的建议使用Block方式来实现动画功能,但是学习本部分对未来学好Block动画有很好的铺垫作用,因此本文在这里会对系统提供的方法进行详尽地介绍

在iOS4之前,我们需要使用动画块(begin/commit animation block)来进行动画,一个完整的动画块由以下四部分组成

  • 动画块开始标识
  • 配置动画选择项
  • 修改可动画属性
  • 动画块结束标识
动画块开始标识

标识动画块的开始,该方法是告诉系统将要执行一个或多个动画,如果通过setAnimationWillStartSelector:或者setAnimationDidStopSelector:方法设置了代理回调方法,便可以在回调方法中收到该方法中的两个参数animationID(动画标志)和context(上下文,一般为nil)

// 格式
+ (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context;
// 样例
[UIView beginAnimations:@"demo" context:nil];
动画块结束标识

标识动画块的结束,同时安排动画执行

// 格式
+ (void)commitAnimations;
// 样例
[UIView commitAnimations];
设置动画代理对象及代理回调方法

设置动画代理对象,以便在动画开始和结束时收到系统回调

// 格式
+ (void)setAnimationDelegate:(nullable id)delegate; 
// 样例
[UIView setAnimationDelegate:self];

设置动画将要开始时调用代理对象的方法

// 格式
+ (void)setAnimationWillStartSelector:(nullable SEL)selector; 
// 样例
[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];

注1: 当动画当前不可用时,该方法不会被调用

注2: 当不设置该方法时,系统默认会调用- (void)animationWillStart:(NSString )animationID context:(void )context

设置动画已经结束后调用代理对象的方法

// 格式
+ (void)setAnimationDidStopSelector:(nullable SEL)selector; 
// 样例
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

注1: 当动画当前不可用时,该方法依然会被调用

注2: 当不设置该方法时,系统默认会调用- (void)animationDidStop:(NSString )animationID finished:(NSNumber )finished context:(void *)context

设置动画持续时长

设置动画持续时长,默认0.2s

// 格式
+ (void)setAnimationDuration:(NSTimeInterval)duration; 
// 样例
[UIView setAnimationDuration:0.2f];

注: 该方法必须在修改”可变化属性”之前调用

设置延时动画时长

设置延时动画时长,默认0.0s

// 格式
+ (void)setAnimationDelay:(NSTimeInterval)delay; 
// 样例
[UIView setAnimationDelay:0.0f];

注: 该方法必须在修改”可变化属性”之前调用

设置动画开始时间(该方法设置后整个动画即不生效,不明原因)

设置动画开始时间,默认当前时间

// 格式
+ (void)setAnimationStartDate:(NSDate *)startDate; 
// 样例
[UIView setAnimationStartDate:[NSDate date]];

注1: 该方法必须在修改”可变化属性”之前调用

注2: 不要在Block动画中调用该方法

注3: 该方法设置后整个动画即不生效,作者尝试过如下四种方式,结果都不生效

[UIView setAnimationStartDate:[NSDate date]];
[UIView setAnimationStartDate:[NSDate dateWithTimeIntervalSinceReferenceDate:CFAbsoluteTimeGetCurrent()]];

[UIView setAnimationStartDate:[NSDate dateWithTimeIntervalSinceNow:3]];
[UIView setAnimationStartDate:[NSDate dateWithTimeIntervalSinceReferenceDate:CFAbsoluteTimeGetCurrent()+3]];
设置时间函数

时间函数即动画进行速度随着时间的变化曲线,系统采用一个枚举类型来保存

/**
 typedef NS_ENUM(NSInteger, UIViewAnimationCurve)
 {
     UIViewAnimationCurveEaseInOut // 默认,淡入淡出,先慢后快再慢
     UIViewA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wenxiangjiang/article/details/51511606

智能推荐

linux 安装dwm界面,ArchLinux dwm的安装和配置-程序员宅基地

文章浏览阅读1.4k次。dwm官网:https://dwm.suckless.org/dwm是一个简洁的平铺式窗口管理器配置简单,使用便捷,没有多少依赖,占用内存非常小总之dwm正合口味安装方法首先在官网下载dwm.tar.gz并解压得到这些东西:BUGS config.mk drw.h dwm.c dwm.png Makefile...我们主要来编辑config.h来进行一些配置和编辑config.mk来正确编译对co..._xxrudwm

Echarts 计算每份占比(等分)_echarts 等分-程序员宅基地

文章浏览阅读814次。option = { series: [ { type: "gauge", startAngle: 190, endAngle: -10, min: 0, max: 100, axisLine: { lineStyle: { width: 15, color: [ [0.3, "#91BB7E".._echarts 等分

Jemeter_jemeter官网下载-程序员宅基地

文章浏览阅读225次。https://www.cnblogs.com/monjeo/p/9330464.html_jemeter官网下载

从工作的角度看 CV/NLP/推荐系统选哪个?-程序员宅基地

文章浏览阅读711次。前言学院第一至第四期具有求职意向的同学中,目前已经有80%的同学拿到了国内外名企的AI算法岗位offer,或者国外名校的AI 硕士、全奖博士录取 offer。在大家的认可下,我们开始了..._cv和nlp哪个好找工作

eNSP网络构建—配置无线网络_ensp无线2个信号访问同一个地址-程序员宅基地

文章浏览阅读1.1w次,点赞14次,收藏117次。需求分析对于小型局域网中, 对于接入设备的需求,需要在局域网中部署无线网络,通过无线控制器AC管理网络中所有的无线AP设备,下发无线配置信息。无线网络发布2 4G和5G信号,满足不同设备的连接使用。拓扑图:注意:防火墙使用USG5500 ,路由器使用AR2220 , AC使用AC6005 , AP使用AP2050。拓扑描述:防火墙连接外网地址为192.168.12.9/24,路由..._ensp无线2个信号访问同一个地址

关于matlab的简介,Matlab 简介-程序员宅基地

文章浏览阅读1.3k次。&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspMatlab(Matrix Laboratory)的中文名叫矩阵实验室,是一款著名的科学计算软件,也指这个软件中使用的编程语言.这里仅介绍最基本的 Matlab 功能和语法,且仅介绍本书使用到的功能.界面介绍图 1:Matlab 的 IDE 界面Matlab 的编程界面(图..._matlab产品的中文名称

随便推点

python资源文件嵌入exe_pyinstaller将资源文件打包进exe中-程序员宅基地

文章浏览阅读921次。在网上看了很多博客,终于找到了符合自己智商可理解的打包资源文件方法,现引用如下https://www.cnblogs.com/darcymei/p/9397173.htmlhttps://blog.csdn.net/sinat_27382047/article/details/81304065"""终于把资源文件加载进去了,就是当exe文件移植后,它运行的时候会产生一个临时文件夹,把资源文件存储到..._pyinstaller如何将_internal添加进exe

H3C模拟器配置vlan-程序员宅基地

文章浏览阅读3.3k次,点赞4次,收藏7次。Valn 11组网需求• 交换机GE_2上的VLAN 5 和VLAN 10 为Primary VLAN,其上层端口GigabitEthernet1/0/1需要允许VLAN 5 和VLAN 10 的报文携带VLAN Tag 通过。• 交换机GE_2 的下行端口GigabitEthernet1/0/2 允许Secondary VLAN 2 通过,GigabitEthernet1/0/3 允许Sec..._新华3模拟器vlan配置

img撑满全屏的方法(img非背景图)_img 铺满-程序员宅基地

文章浏览阅读4.7w次,点赞8次,收藏15次。我有一个模板,想按常规做一个div里面放置一个img图片,并且让图片铺满容器,自适应容器大小。HTML结构代码如下(在这个盒模型上,我已经放置了一些不重要的样式)。div style="height:270px;width:400px;border:2px black solid;"> a href="http://www.paipk.com">img src="..." alt="拍_img 铺满

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb0 in position 5: invalid start byte_ebpf bcc unicodedecodeerror: 'utf-8' codec can't d-程序员宅基地

文章浏览阅读947次。UnicodeDecodeError: 'gbk' codec can't decode byte 0xfa in position 4669: illegal multibyte sequenceUnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 5: invalid start bytewith open('进线汇总20201211.csv',encoding='utf8') as f: t = f._ebpf bcc unicodedecodeerror: 'utf-8' codec can't decode byte 0xb0 in positio

使用条件序列GAN改进NMT_improving neural machine translation with conditio-程序员宅基地

文章浏览阅读1.3k次。使用条件序列GAN改进NMT原文《Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets》课程作业,因为要导出pdf所以粘贴到CSDN了,34章是笔者翻译的部分。当一篇post吧,求别喷,有问题请留言我一定改,一定改。摘要本文提出了一种将GANs应用于NMT领域的方..._improving neural machine translation with conditional sequence generative ad

产品周报第33期|完善铁粉规则,优化原创保护策略,升级创作中心的数据展示,开放业界专家自定义域名权益……_创作者中心铁粉数0-程序员宅基地

文章浏览阅读5k次。目录一、博客产品功能完善1、完善铁粉说明规则2、创作中心专栏数据升级3、发文助手新增「添加模版」指引4、免费开放业界专家自定义域名权益5、其他优化二、问答产品体验优化1、回答链接和链接详情页调整2、PC端提问页优化3、创作中心页面的问答列表优化三、首页热榜及优质内容推进方面的改进四、吐槽提建议直通车,直达CSDN各产品与运营人员查看往期改进hello,大家好,这里是「CSDN产品周报」第33期。本次更新主要涉及博客、问答及首页,欢迎大家详细了解和使_创作者中心铁粉数0