Cocoachina教学:Core Animation入门

本文是一篇关于CoreAnimation的基础教学,旨在帮助开发者掌握使用CoreAnimation创建动态界面动画的方法。通过本教程,你将了解CoreAnimation的基本概念、优势以及如何在程序中应用它来实现动画效果。主要内容包括CoreAnimation的工作原理、如何在视图中启用支持、使用层(CALayer)进行绘图、以及如何创建和应用动画。教程以实例演示如何在自定义视图中添加动画,例如旋转图片。最后预告后续内容将涉及更复杂的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,Cocoachina会开始一个Core Animation的入门教学,和大家共同学习Core Animation的使用。本站介绍过不少Core Animation的文章,这篇文章是一个入门教学,从头帮助你了解Core Animation以及如何入门。

Core Animation是苹果在Leopard中加入的新API,主要用于利用显卡硬件制作动态的用户界面。同时,在iPhone SDK中也支持这种API。在Leopard和iPhone中,你会看到苹果大量使用这种很酷的效果,比如iTunes/iPhone的CoverFlow效果:

 

Core Animation的好处

Core Animation的最大好处是可以帮助Mac或者iPhone的开发者减少代码量。因为如果你想用Core Image或者Open GL实现界面的动画特效,其实也是可以的,主要是非常麻烦。而用Core Animation可以极大简化开发难度和减少代码量。

 

如果你想用Core Animation建立你自己独特的用户界面,首先强烈建议你有一点艺术感,单单会使用Core Animation不能让你成为艺术家。另外,你最好会用一点Adobe Photoshop或者Adobe Flash,在实现效果之前,先动手画一画,心里大致有个感觉。

本文不会涉及到太深的技术或是数学算法层面,作者本人在这方面非常不精通。本文只是简单地把你从苹果晦涩的技术文档中解救出来,看过这篇文章后你应该可以开始直接在程序里使用Core Animation了。

需要了解哪些

阅读本文之前,最好你已经有一点Cocoa开发的基础,本文不会详述细节。首先,你需要了解Objective-C,如果不了解,可以先看一下本站的新手文章:

另外你还要了解一点Objective-C 2.0的属性说得是什么。同时,你需要了解如何使用XCode,这是比较基本的。

开始

要在Cocoa程序中使用Core Animation,首先要在程序中引用Quartz.framework,另外在.h文件中需要包含

#import <Quartz/Quartz.h>

 

这样就可以使用了。

 

Core Animation绘图的基础是“层”,叫做CALayer。你可以在View中设置层,层中可以放置更多的层。每个层都可以设定单独的动作,还可以给上一级的层设置动作,下一级的层就可以跟着上一层进行动作。iPhone官方SDK同样支持CALayer,而在底层的Toolchain中,你需要用的类叫做LKLayer(Layer Kit),其实是一样的。

 

Core Animation动画的基础主要是CAAnimation和CATransition,CAAnimation主要用于设定层的动作,比如放大缩小旋转等等,而CATransition主要用于比如设置渐变、翻页、切换等一些比较特殊的特效。

 

Core Animation的动画是基于View的,最简单的用法是使用View的animator,修改一下View对象的属性,但是消息发给对象的animator即可。比如从前你可能这么写:

[我的一个view set数值:xx];

那么你现在如果这么写:

[[我的一个view animator] set数值:xx],它就会动。

 

想在View中打开Core Animation支持,你可以用以下方法实现:

[我的view setWantsLayer:YES];

或是

我的view. setWantsLayer= YES; 这是Objective C 2.0的写法

再或者在Interface Builder中打开这个选项:

 

创建支持Core Animation的View

 

接下来用一个简单的例子介绍一下如何做一个基于层的View用来支持Core Animation。

 

首先在Interface Builder里拽一个Custom View,拽进窗口,改名,随便叫什么,比如我改为TestView:

 

在菜单中选择Write Class…,保存到项目中。你就可以在这个View里面做点能动的东西了。

 

在层中画图

 

你可以直接在View里面使用drawLayer:方法画层。不过一般来说,我们都会在层中使用一些图片。要给CALayer设置图片,你只需使用xxlayer.contents指定contents的属性为一个图片就可以在层上显示图片。只是CALayer需要的图片类型是CGImageRef,而我们比较容易获取的图片类型是NSImage。你可以使用下面的函数将NSImage转换为CGImageRef

 

 

- (CGImageRef)nsImageToCGImageRef:(NSImage*)image;

{

    NSData * imageData = [image TIFFRepresentation];

    CGImageRef imageRef;

    if(imageData)

    {

        CGImageSourceRef imageSource = 

CGImageSourceCreateWithData(

(CFDataRef)imageData,  NULL);

 

        imageRef = CGImageSourceCreateImageAtIndex(

  imageSource, 0NULL);

    }

    return imageRef;

}

把这个函数复制到你的View代码中,我们会需要用到它。

 

现在我们来做一个方法,叫做setupLayers:

 

-(void) setupLayers

{

}

 

然后在你的awakeFromNib中加入:

 

[self setupLayers];

 

我们会在setupLayers这个方法中建立层,别忘了在你的.h文件中也加入这个方法的定义。

接下来,在项目中添加一个图片,比如我叫它1.png,我会在层中显示这个图片:

 

 

加入之后,在setupLayers方法中加入下面几句话:

 

 

CGRect viewFrame=NSRectToCGRect([self frame]);

CALayer *rootLayer=self.layer;

rootLayer.frame=viewFrame;

 

这三句话的意思是,获得这个View本身的层,并将其大小设定为view的大小。这个层就是我们的基础层,我们之后添加的层会在这个rootLayer之上。

 

定义一个CALayer:

 

CALayer *layer1;

 

然后创建这个层:

 

layer1=[CALayer layer] ;

 

然后获取我们刚才加进项目的图片:

 

NSImage *image1=[NSImage imageNamed:@"1"] ;

 

把这个图片设置在layer1上显示:

 

layer1.contents=(id)[self nsImageToCGImageRef:image1];

 

设置层的大小和位置:

 

 

layer1.frame=CGRectMake(0,0,320,240);

layer1.position=CGPointMake(viewFrame.size.width/2, viewFrame.size.height/2); //定位到屏幕中间

 

添加到rootLayer上:

 

 

[rootLayer addSublayer:layer1];

 

这幅图片就显示出来了:

在你那里看起来和这幅图不一样的原因是我画了一下背景:

 

- (void)drawRect:(NSRect)rect 

//画背景

NSGradient *gradient=[[NSGradient allocinitWithStartingColor: [NSColor colorWithCalibratedWhite:0.35 alpha:1.0

endingColor:[NSColor colorWithCalibratedWhite:0 alpha:1.0]];

[gradient drawInRect:rect angle:90.0];

}

 

View的drawRect:方法可以和Core Animation并存,因此你的程序会先画出这个渐变的背景,然后在上面画这个带图片的层。

 

开始动画

这个教学里我暂时不打算说太多复杂的内容,先来点能看到实际效果的东西。我们将这幅图横向旋转一下,这个效果有点像Dashboard中进行设置的感觉:

 

添加下面的代码:

 

-(void)flip

{

[CATransaction setValue:[NSNumber numberWithFloat:1.0forKey:kCATransactionAnimationDuration];

CABasicAnimation *FlipAnimation=[CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];

FlipAnimation.timingFunction= [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

FlipAnimation.toValue= [NSNumber numberWithFloat:M_PI]; 

FlipAnimation.duration=1;

FlipAnimation.fillMode=kCAFillModeForwards;

FlipAnimation.removedOnCompletion=NO;

[layer1 addAnimation:FlipAnimation forKey:@"flip"];

[CATransaction commit];

}

 

在layer1 addAnimation的时候,动画就加进去并自动运行了。这段代码的意思是延y轴将layer1旋转180度,持续时间1秒,旋转完成后保持状态。

 

“transform.rotation.y”你可以在Core Animation的文档中查到,用于旋转y轴。

 

FlipAnimation.toValue= [NSNumber numberWithFloat:M_PI]; 

 

中的M_PI就是pi,因为旋转角度使用弧度而不是角度,所以pi就是半个圆,也就是180度。

 

 

FlipAnimation.fillMode=kCAFillModeForwards;

FlipAnimation.removedOnCompletion=NO;

 

而上面这两句话的意思就是旋转之后保持状态。否则旋转的动画完成之后,动画将自动删除,而你的层也会回到初始状态。

 

在awakeFromNib中加入下面代码执行:

 

 

[self flip];

 

执行之后你就会看到这幅图片按照动画的效果横向旋转了180度。

 

 

这个教学还没完,主要是我的网今天有点问题,周末了有点懒。下次可能会继续介绍点更好玩的Core Animation动画。关于如何继续这个教学,我现在没有太多好想法,如果你有什么点子,可以在这里留言,我们一起尝试着用Core Animation实现一下。另外给图片加了点水印,还请亲爱的读者谅解。

 

下次将介绍一下多个动作的动画效果,先预告一下:)

 

目录 1. 开始 . 4 1.1.1.1. 基本设置 基本设置 . 4 建立你的 建立你的 SwiftSwift 环境 . 5 理解 SwiftSwift 导入过程 导入过程 . 6 2. 互用性 互用性 . 7 2.1. 2.1. 与 Objective ObjectiveObjective Objective Objective-C API 交互 7 初始化 (Initialization)(Initialization) (Initialization) (Initialization) (Initialization) (Initialization)(Initialization)(Initialization)(Initialization) (Initialization) 7 访问属性 访问属性 (Accessing Properties)(Accessing Properties) (Accessing Properties) (Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties)(Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties) . 8 方法 (Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) . 9 id 兼容性 兼容性 (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility) (id Compatibility) (id Compatibility) 10 使用 nil (Working with nilWorking with nilWorking with nilWorking with nil Working with nil Working with nil Working with nil Working with nil ) . 11 扩展( Extensions Extensions Extensions Extensions ) . 12 闭包( Closures ClosuresClosures Closures ) . 13 比较对象( 比较对象( Object Comparison Object Comparison Object Comparison Object Comparison Object ComparisonObject ComparisonObject ComparisonObject ComparisonObject Comparison) 14 SwiftSwift 类型兼容性( 类型兼容性( 类型兼容性( Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type Compatibility Swift Type Compatibility) . 14 Objective Objective Objective Objective-C选择器 选择器 (Selectors)(Selectors)(Selectors) (Selectors)(Selectors)(Selectors)(Selectors) 15 2.2. 2.2. 使用 Objective Objective Objective Objective-C特性编写 特性编写 SwiftSwift 类 16 继承 Objective ObjectiveObjective Objective Objective-C的类 16 采用协议 采用协议 . 17 编写构造器 和析编写构造器 和析编写构造器 和析编写构造器 和析 . 17 集成 Interface Builder Interface BuilderInterface Builder Interface BuilderInterface Builder Interface Builder Interface Builder Interface Builder Interface Builder . 18 指明属性 特指明属性 特指明属性 特 . 19 实现 Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses 20 2.3. Cocoa2.3. Cocoa 2.3. Cocoa 2.3. Cocoa2.3. Cocoa2.3. Cocoa数据类型 数据类型 . 20 字符串 . 21 数字 . 22 类集合 . 22 FoundationFoundationFoundation Foundation FoundationFoundation Foundation数据类型 . 24 FoundationFoundationFoundation Foundation FoundationFoundation Foundation函数 . 25 Core Foundation Core FoundationCore FoundationCore Foundation Core FoundationCore Foundation Core Foundation Core FoundationCore Foundation Core Foundation 25 2.4. 2.4. 采用 Cocoa CocoaCocoaCocoa设计模式 设计模式 . 27 委托 . 27 延迟初始化 延迟初始化 . 28 错误报告 错误报告 . 28 键值观察 键值观察 . 29 TargetTarget TargetTarget -Action Action Action模式 29 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 . 29 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 3 2.5. 2.5. 与 C 语言交互编程 语言交互编程 语言交互编程 语言交互编程 30 基本数据类型 基本数据类型 基本数据类型 . 30 枚举 . 31 指针 . 32 全局常量 全局常量 . 37 预处理指令 预处理指令 . 37 3.Mix and Match3.Mix and Match 3.Mix and Match 3.Mix and Match 3.Mix and Match3.Mix and Match 3.Mix and Match3.Mix and Match . 39 3.1. 3.1. 在同一工程中使用 在同一工程中使用 在同一工程中使用 在同一工程中使用 SwiftSwift Swift 和 Objective Objective Objective Objective-C . 39 Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match 概述 . 39 在同一个 在同一个 App Target App Target App TargetApp TargetApp TargetApp Target 中进行代码导入 中进行代码导入 中进行代码导入 中进行代码导入 . 40 在同个 在同个 Framework Framework Framework Framework Framework Framework Framework 的 TargetTarget TargetTarget 中导入代码 中导入代码 中导入代码 . 43 将 Swift Swift Swift 导入 Objc Objc . 44 导入外部 导入外部 FramewoFramewoFramewo FramewoFramewoFramework 44 在 Objective Objective Objective Objective-C中使用 中使用 SwiftSwift Swift 45 Product ModuleProduct ModuleProduct ModuleProduct Module Product Module Product Module Product Module Product Module 模块命名 模块命名 . 47 问题解决提示 问题解决提示 问题解决提示 . 47 4. 迁移 . 48 4.1. 4.1. 将 Objective ObjectiveObjective Objective Objective-C代码迁至 代码迁至 代码迁至 SwiftSwift . 48 为你的 为你的 Objective Objective Objective Objective-C代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 48 迁移过程 迁移过程 . 48 问题解决提示 问题解决提示 问题解决提示 . 50 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 4 1. 开始 1.1.1.1.1.1.1.1.基本 设置 本篇译者: 本篇译者: CreolophusCreolophusCreolophusCreolophus Creolophus Creolophus (githubgithubgithub githubgithub主页 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 重要事项 这篇文章初步介绍了在开发中用到的 API 或技术。苹果公司提供这些信息来帮助您规划本文所说明的技术和接口以用于苹果的产品上。这些信息会改变,并且根据这篇文章所实现的软件应该在最新的操作系统并根据最新的文档测试。本文档的新版本,可能在未来通过技术和 API 的 seeds 版本来提供 Swift 被设计用来无缝兼容 CocoaObjective-C 。在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中 使用 Swift 的 API。这种兼容性使 Swift 变成了一个简单、方便并且强大的工具集成到你的 Cocoa 应用开发工作流程中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值