ios两个子视图同一时间进入和离开动画
来源:互联网 发布:阿里云 ace 编辑:程序博客网 时间:2024/05/18 02:38
在一个视图控制器中,加入了两个视图targetSubview和sourceSubview。targetSubview默认是隐藏的,sourceSubview默认是可见的。
现在,我有这样一个需求。通过手指下滑,将targetSubview从上向下拉入到屏幕中,同时,sourceSubview将随着从屏幕下方离开。两个视图同步进入和离开是同步操作,用动画来实现。
第一种方法,使用UIView的类方法transition来实现,
[UIView transitionFromView:sourceSubview toView:targetSubview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
但,只能实现上下或左右翻转的效果,没有找到上下滑入滑出的效果。而且,该方法还将sourceSubview给remove掉了。
因此,这种方法不能满足要求。
第二种方法,使用使用UIView的类方法Animations来实现,是用delegate做一些前置或后置操作。
targetSubview.frame = CGRectMake(0, targetSubview.frame.size.height + 50, targetSubview.frame.size.width, targetSubview.frame.size.height);
[UIView beginAnimations:@"Anim1" context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
targetSubview.hidden = NO;
targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);
[UIView commitAnimations];
[UIView beginAnimations:@"Anim2" context:nil];
[UIView setAnimationDuration:3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
sourceSubview.frame = CGRectMake(0, -50, sourceSubview.frame.size.width, sourceSubview.frame.size.height);
sourceSubview.hidden = YES;
[UIView commitAnimations];
//动画结束后执行
//sourceSubview.hidden = YES;
这个方法实现了targetSubview视图的动画方式缓缓进入,但sourceSubview立即消失,没有动画效果。
因此在第二个动画设置中,我将sourceSubview.hidden设置为了yes,如果不设置会有动画效果,但是sourceSubview视图因为过高会有部分遗留在屏幕上。
即使,在动画结束后设置也该属性,也不行。
这个动画的效果,实际上是在后台执行的,类似多线程方式在运行。动画运行时间设置为1秒,但最后程序不会等待的,因此,这里需要设置delegate才能实现这个效果了。在动画结束后,delegate方法+ (void)setAnimationDidStopSelector:(SEL)selector必须实现,在该方法中调用sourceSubview.hidden = YES;才行。
在动画开始前,也有一个delegate方法+ (void)setAnimationWillStartSelector:(SEL)selector,可以做一些设置。
第三种方法,还是使用使用UIView的类方法Animations来实现,但是是用block实现,需要在ios4.0以上才能执行。现在苹果都将ios版本都升级到7.0,老版本的用户越来越少了。
targetSubview.alpha=0.0;
targetSubview.hidden = NO;
[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
targetSubview.frame = CGRectMake(0, -50, targetSubview.frame.size.width, targetSubview.frame.size.height);
targetSubview.alpha=1.0;
targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);
sourceSubview.frame = CGRectMake(0, sourceSubview.frame.size.height, sourceSubview.frame.size.width, sourceSubview.frame.size.height);
sourceSubview.alpha=0.0;
} completion:^(BOOL finished) {
[self printSubviews];
sourceSubview.hidden = YES;
sourceSubview.alpha=1.0;
}];
最后,使用这个简单点的方法实现了需求。
在动画结束后,将sourceSubview设置为隐藏。
UIView中可以设置动画效果的属性:
frame
bounds
center
transform
alpha
backgroundColor
contentStretch
现在,我有这样一个需求。通过手指下滑,将targetSubview从上向下拉入到屏幕中,同时,sourceSubview将随着从屏幕下方离开。两个视图同步进入和离开是同步操作,用动画来实现。
第一种方法,使用UIView的类方法transition来实现,
[UIView transitionFromView:sourceSubview toView:targetSubview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
但,只能实现上下或左右翻转的效果,没有找到上下滑入滑出的效果。而且,该方法还将sourceSubview给remove掉了。
因此,这种方法不能满足要求。
第二种方法,使用使用UIView的类方法Animations来实现,是用delegate做一些前置或后置操作。
targetSubview.frame = CGRectMake(0, targetSubview.frame.size.height + 50, targetSubview.frame.size.width, targetSubview.frame.size.height);
[UIView beginAnimations:@"Anim1" context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
targetSubview.hidden = NO;
targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);
[UIView commitAnimations];
[UIView beginAnimations:@"Anim2" context:nil];
[UIView setAnimationDuration:3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];
sourceSubview.frame = CGRectMake(0, -50, sourceSubview.frame.size.width, sourceSubview.frame.size.height);
sourceSubview.hidden = YES;
[UIView commitAnimations];
//动画结束后执行
//sourceSubview.hidden = YES;
这个方法实现了targetSubview视图的动画方式缓缓进入,但sourceSubview立即消失,没有动画效果。
因此在第二个动画设置中,我将sourceSubview.hidden设置为了yes,如果不设置会有动画效果,但是sourceSubview视图因为过高会有部分遗留在屏幕上。
即使,在动画结束后设置也该属性,也不行。
这个动画的效果,实际上是在后台执行的,类似多线程方式在运行。动画运行时间设置为1秒,但最后程序不会等待的,因此,这里需要设置delegate才能实现这个效果了。在动画结束后,delegate方法+ (void)setAnimationDidStopSelector:(SEL)selector必须实现,在该方法中调用sourceSubview.hidden = YES;才行。
在动画开始前,也有一个delegate方法+ (void)setAnimationWillStartSelector:(SEL)selector,可以做一些设置。
第三种方法,还是使用使用UIView的类方法Animations来实现,但是是用block实现,需要在ios4.0以上才能执行。现在苹果都将ios版本都升级到7.0,老版本的用户越来越少了。
targetSubview.alpha=0.0;
targetSubview.hidden = NO;
[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
targetSubview.frame = CGRectMake(0, -50, targetSubview.frame.size.width, targetSubview.frame.size.height);
targetSubview.alpha=1.0;
targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);
sourceSubview.frame = CGRectMake(0, sourceSubview.frame.size.height, sourceSubview.frame.size.width, sourceSubview.frame.size.height);
sourceSubview.alpha=0.0;
} completion:^(BOOL finished) {
[self printSubviews];
sourceSubview.hidden = YES;
sourceSubview.alpha=1.0;
}];
最后,使用这个简单点的方法实现了需求。
在动画结束后,将sourceSubview设置为隐藏。
UIView中可以设置动画效果的属性:
frame
bounds
center
transform
alpha
backgroundColor
contentStretch
- ios两个子视图同一时间进入和离开动画
- iOS-如何判断touch到子视图或离开视图
- iOS第七章 视图和动画
- 如何知道鼠标进入及离开一个视图?
- 如何判断touch到子视图或离开视图
- ios子视图和父视图同时处理输入事件
- 离开和进入trusted os的过程
- 仿拉勾网动画效果-----鼠标进入和离开元素4个方向对应的相关操作(非常炫酷)
- 【iOS开发-51】案例学习:动画新写法、删除子视图、视图顺序、延迟方法、按钮多功能用法及icon图标和启动页设置
- ios视图缩放动画
- ios视图缩放动画
- iOS视图动画效果
- iOS视图切换动画
- iOS 视图抖动动画
- ios 子视图
- iOS删除子视图
- iOS 查找子视图
- IOS UIKIT框架类之视图动画和坐标系介绍!
- 广告传媒业营销商业智能的分析内容
- linux PATH环境变量缓存
- 计算机科学中最重要的32个算法(转)
- LAMP网站架构方案分析
- 练习1.20
- ios两个子视图同一时间进入和离开动画
- android里每个服务启动时context
- 在WINDOWS中设置计划任务执行PHP文件
- 人口和生育信息统计分析BI系统简介
- SPI协议及其工作原理浅析
- mysql-cluster-gpl-7.1.17 安装配置脚本
- 查看Windows 7的历史开机/关机时间
- 【hive】pentaho无法查询hive
- Apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for