属性动画只对图层的可动画属性起作用,所以如果要改变一个不能动画的属性(比如图片),或者从层级关系中添加或者移除图层,属性动画将不起作用。

于是就有了过渡的概念。过渡并不像属性动画那样平滑地在两个值之间做动画,而是影响到整个图层的变化。过渡动画首先展示之前的图层外观,然后通过一个交换过渡到新的外观。

为了创建一个过渡动画,我们将使用CATransition,同样是另一个CAAnimation的子类,和别的子类不同,CAAnimation有一个type和subtype来标识变换效果;

type:

kCATransitionFade 
kCATransitionMoveIn 
kCATransitionPush 
kCATransitionReveal
kCATransitionMoveIn从顶部滑动进入,但不像推送动画那样把老土层推走,然而kCATransitionReveal把原始的图层滑动出去来显示新的外观,而不是把新的图层滑动进入。
subtype(可以通过subtype来控制它们的方向):
kCATransitionFromRight 
kCATransitionFromLeft 
kCATransitionFromTop 
kCATransitionFromBottom
清单8.11 使用CATransition来对UIImageView做动画
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIImageView *imageView;
@property (nonatomic, copy) NSArray *images;
@end
@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    //set up images
    self.images = @[[UIImage imageNamed:@"Anchor.png"],
                    [UIImage imageNamed:@"Cone.png"],
                    [UIImage imageNamed:@"Igloo.png"],
                    [UIImage imageNamed:@"Spaceship.png"]];
}
- (IBAction)switchImage
{
    //set up crossfade transition
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionFade;
    //apply transition to imageview backing layer
    [self.imageView.layer addAnimation:transition forKey:nil];
    //cycle to next image
    UIImage *currentImage = self.imageView.image;
    NSUInteger index = [self.images indexOfObject:currentImage];
    index = (index + 1) % [self.images count];
    self.imageView.image = self.images[index];
}
@end

你可以从代码中看出,过渡动画和之前的属性动画或者动画组添加到图层上的方式一致,都是通过-addAnimation:forKey:方法。但是 和属性动画不同的是,对指定的图层一次只能使用一次CATransition,因此,无论你对动画的键设置什么值,过渡动画都会对它的键设置成 “transition”,也就是常量kCATransition。

隐式过渡

CATransision 可以对图层任何变化平滑过渡的事实使得它成为那些不好做动画的属性图层行为的理想候选。苹果当然意识到了这点,并且当设置了CALayer的 content属性的时候,CATransition的确是默认的行为。但是对于视图关联的图层,或者是其他隐式动画的行为,这个特性依然是被禁用的,但 是对于你自己创建的图层,这意味着对图层contents图片做的改动都会自动附上淡入淡出的动画。

我们在第七章使用CATransition作为一个图层行为来改变图层的背景色,当然backgroundColor属性可以通过正常的CAPropertyAnimation来实现,但这不是说不可以用CATransition来实行。

对图层树的动画

CATransition 并不作用于指定的图层属性,这就是说你可以在即使不能准确得知改变了什么的情况下对图层做动画,例如,在不知道UITableView哪一行被添加或者删 除的情况下,直接就可以平滑地刷新它,或者在不知道UIViewController内部的视图层级的情况下对两个不同的实例做过渡动画。

这些例子和我们之前所讨论的情况完全不同,因为它们不仅涉及到图层的属性,而且是整个图层树的改变--我们在这种动画的过程中手动在层级关系中添加或者移除图层。

这里用到了一个小诡计,要确保CATransition添加到的图层在过渡动画发生时不会在树状结构中被移除,否则CATransition将会和图层一起被移除。一般来说,你只需要将动画添加到被影响图层的superlayer。

在 清单8.12中,我们展示了如何在UITabBarController切换标签的时候添加淡入淡出的动画。这里我们建立了默认的标签应用程序模板,然后用 UITabBarControllerDelegate的-tabBarController:didSelectViewController:方法来 应用过渡动画。我们把动画添加到UITabBarController的视图图层上,于是在标签被替换的时候动画不会被移除。

清单8.12 对UITabBarController做动画

#import "AppDelegate.h"
#import "FirstViewController.h" 
#import "SecondViewController.h"
#import @implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    UIViewController *viewController1 = [[FirstViewController alloc] init];
    UIViewController *viewController2 = [[SecondViewController alloc] init];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.tabBarController.delegate = self;
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    //set up crossfade transition
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionFade;
    //apply transition to tab bar controller's view
    [self.tabBarController.view.layer addAnimation:transition forKey:nil];
}
@end

转载于:https://www.cnblogs.com/jingdizhiwa/p/5490321.html

CATransition(过渡)相关推荐

  1. CoreAnimation--CALayer的动画

    CoreAnimation--CALayer的动画 核心动画中所有类都遵守CAMediaTiming CAAnaimation和CAPropertyAnimation都是抽象类,本身不具备动画效果,必 ...

  2. iOS开发知识点总结

    main文件做了这几件事:1. 创建当前的应用程序2. 根据4个参数的最后为应用程序设置代理类(默认情况下是AppDelegate)3. 将appDelegate 和 应用程序 建立关联(指定代理,) ...

  3. 图片浏览(CATransition)转场动画

    Main.storyboard ViewController.m // //  ViewController.m //  8A04.图片浏览(转场动画) // //  Created by huan ...

  4. CATransition 动画

    [UIView commitAnimations];     [UIView beginAnimations:nil context:nil]; [UIView setAnimationRepeatA ...

  5. CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup,UIBezierPath之间做动画的不同点和各自的使用范围。

    CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup,UIBezierPath之间做动画的不同点和各自的使用范围. CA ...

  6. iOS动画之转场动画CATransition

    CATransition转场动画 提供层状态间动画转换的对象. 你可以通过创建和添加一个cattransitions对象到一个层的状态之间的过渡.默认转换是交叉渐隐,但是您可以从一组预定义转换指定不同 ...

  7. 八 iOS之 CATransition (转场动画)

    CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果. 动画转场类型 类型字符串 效果说明 关键字 方向 fade 交叉淡化过渡 YES p ...

  8. Xamarin.iOS启动图片过渡及广告展示

    1.实现效果 启动应用时,启动图片自然过渡到广告图片中(外加基本动画[波纹及上翻页]),如: 2.实现方式 在FinishedLaunching执行时,往UIWindow里AddSubview视图,在 ...

  9. 从C到C++过渡的3个原因

    从C到C++过渡的3个原因 3 reasons to transition from C to C++ 几十年来,嵌入式软件工程师们一直在争论他们是否应该使用C或C++.根据2019年嵌入式市场调查, ...

  10. android 官方默认动画,Android动画一:Activity过渡动画详细实现原理

    虽然 Android 5.0 之后推出了新的过渡动画方式,但通常只是用于特定的场合使用,activity.overridePendingTransition() 通用方式的过渡动画还是很常用. 原理分 ...

最新文章

  1. guice google_与Google Guice的动手实践
  2. LeetCode实战:格雷编码
  3. php libev pthreads,libuv 与 libev 的对比
  4. 关于301跳转的多种办法
  5. 扩展Reporting Services和SQL Server 2016中的更改
  6. 创建类(点击获得位置信息)—ArcGIS API for JavaScript
  7. idea2020版Maven依赖成功导入但仍然报错找不到包解决
  8. devc调试设置断点后没有反应_基于VSCode的skynet调试器
  9. 中兴新支点Linux国产操作系统安装windows字体的方法
  10. as几个常用模拟器连接命令
  11. HTTP服务器错误状态码4XX、5XX
  12. 再回顾SGX初始化(二)——uRTS端构建Enclave
  13. MATLAB中subs函数
  14. Redis底层数据结构——跳跃列表
  15. perl学习笔记-----------------------(8)
  16. Android 4.4 kitkat以上及以下根据uri获取路径的方法
  17. 计算机课app开发,毕业设计(论文)-基于Android的《计算机网络基础》课程App的设计与开发.doc...
  18. linux用户管理(2)----修改用户模式(usermod,sudo权限等)
  19. python 酷炫效果_六种酷炫Python运行进度条效果的实现代码
  20. 计算机bips,bips是指计算机的什么

热门文章

  1. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
  2. 构建Postfix邮件系统(一) -- postfix+dovecot
  3. iPhone文件系统:创建、重命名以及删除文件
  4. 老愤青也来说两句,也谈青年程序员如何进入职场
  5. libfaac个个参数说明
  6. ASP.NET MVC 使用dataTable(3)--更多选项参考
  7. 轻量级MVC框架(自行开发)
  8. Windows上SVN服务器搭建【转】
  9. ASP.NET以编程的方式动态的添加Css引用
  10. C# winform 上传文件 (多种)