- 浏览: 773818 次
- 性别:
- 来自: 天堂
文章分类
最新评论
-
xiaozhao-521:
呀呀呀呀呀呀呀
RequestTest222 -
Andy_hyh:
打扰了,问下openmeeting源码可以运行起来吗?
Openmeetings安装 详细步骤 -
qindongliang1922:
擦,现在还行么,厉害
北京免费吃饭的地方 -
minixx77:
...
Openmeetings安装 详细步骤 -
wwwqqqiang:
喜欢楼主分享问题的方式,有思想
UIView 和 CALayer的那点事
今天,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, 0 , NULL ); } return imageRef; }
把这个函数复制到你的View代码中,我们会需要用到它。
现在我们来做一个方法,叫做setupLayers:
-(void ) setupLayers { }
然后在你的awakeFromNib中加入 :
[ self setupLayers];
我们会在setupLayers这个方法中建立层,别忘了在你的.h文件中也加入这个方法的定义。
接下来,在项目中添加一个图片,比如我叫它1.png,我会在层中显示这个图片:
加入之后,在setupLayers方法中加入下面几句话:
-(void ) 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 alloc] initWithStartingColor: [ 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.0 ] forKey: 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度。
发表评论
-
iOS 自定义UIActionSheet
2012-12-18 16:07 16424一:模态视图 UIActi ... -
UIView 和 CALayer的那点事
2012-11-17 23:51 30782UIView 和 CALayer的那点事 (1 ... -
iOS Open Source : Popover API for iPhone
2012-01-20 15:02 1948http://iphonedevelopertips.com/ ... -
ios 任务、线程、定时器
2011-12-26 18:09 8032一:operations(任务) cocoa提供了三种 ... -
ios url缓存策略——NSURLCache、 NSURLRequest
2011-12-26 17:09 24360一:url 缓存策略 NSURLRequest ... -
ios NSInvocation简单使用
2011-12-22 16:39 6379在ios直接调用某个对象的消息是方法有两种: 一:perfo ... -
iphone 对Web Services的三种请求方式soap get post
2011-11-09 10:57 6444一:Using SO AP 1.1 POST / ... -
sdk3.2手势实例
2011-11-09 10:11 1747#import <UIKit/UIKit.h>@i ... -
关于iphone 利用hpple解析html的问题
2011-08-04 18:28 2229最近在用happe解析html中的图片。有个翻页操作,如果请 ... -
iphone hpple 解析html,xml
2011-07-19 16:21 2755使用Objective-C解析HTML或者XML,系统自带有两 ... -
激活 iPhone通过 GPRS 连接服务器功能的代码
2011-05-13 15:14 1663如果您的 iPhone 应用里含有连接服务器的功能,也许会遇到 ... -
address book api 图型
2011-04-28 15:51 1151最近要搞地址簿了,整理一下 -
[OmniGraffle]iPhone app原型制作工具
2011-04-06 17:35 3962在写程序之前,我们通常需要做一些mockup出来(不知道款爷有 ... -
自定义uislider 样式
2011-04-04 21:28 3844UIImage *stetchLeftTrack= [[UII ... -
iphone 下AsyncSocket网络库编程
2011-04-02 21:04 7647iphone的标准推荐CFNetwork ... -
进阶AlertView运用 - 登入设计
2011-04-01 17:52 3043说明:示范如何利用AlertView来制作系统登入的介面程式碼 ... -
iPad UIPopoverController弹出窗口的位置和坐标
2011-04-01 17:42 2008优化规则: TodoViewControlle ... -
iPhone系统自动化测试
2011-04-01 17:39 2624首先mac系统是必备的2 安装iPhone SD ... -
iphone上面编写具有root权限的程序
2011-04-01 17:31 6302正常途径下, 我们编写的程序发布在App store上, 使用 ... -
聊天。。。。。
2011-04-01 17:13 1095是得分手段
相关推荐
**核心动画编程指南**是苹果公司为iOS和Mac OS X开发者提供的一份重要参考资料,它深入解析了Core Animation框架的使用方法和核心技术。Core Animation是苹果操作系统中的一个关键图形渲染技术,它允许开发者创建高...
CocoaChina作为中国最大的iOS开发者社区,提供了丰富的教程和资源,帮助开发者实现这一功能。 下拉刷新,也被称为“Pull-to-Refresh”或“Infinite Scrolling”,其基本工作原理是用户在顶部向下拖动视图,当达到...
《iOS应用源码解析——以CocoaChina为例》 在iOS开发领域,源码学习是提升技术能力的重要途径。CocoaChina,作为国内知名的iOS开发者社区,提供了丰富的学习资源,其中包括许多优秀的开源项目。本篇文章将围绕...
小弟新作 个人开发CocoaChina客户端 Masonry,bMob,GoogleAd... 欢迎尝鲜!!欢迎下载 http://cocoachina.bmob.cn 源码地址: https://bitbucket.org/dami7786/cocoachina/
6. **动画效果**:讲解Core Animation的基本概念和高级用法,实现平滑流畅的界面动画。 7. **自动布局**:理解Auto Layout和Size Class,实现自适应的用户界面。 8. **MVVM设计模式**:介绍如何在iOS项目中实施MVVM...
【COCOACHINA669知识点整理】 在IT领域,COCOACHINA是一个知名的中文iOS和Android开发者社区,提供了丰富的技术文章、教程和讨论,帮助开发者提升技能。669在这里可能指的是一个特定的话题或者一系列的学习资源编号...
9. **动画与Core Animation**: 动画是提升用户体验的关键,这部分可能涉及CALayer和UIView动画的使用。 10. **多线程编程**: 包括GCD(Grand Central Dispatch)和NSOperationQueue,用于在后台处理任务,提高应用...
Swift-CocoaChina是一款基于开源社区CocoaChina设计的移动端应用,完全使用Swift 2.0编程语言编写。这个项目的目的是为开发者提供一个学习、交流iOS开发技术的平台,同时也展示了Swift在实际项目中的应用和优势。 ...
【标题】:“CocoaChina整理知识点670条(前335条)” 这篇整理集合了CocoaChina社区中的精华知识,涵盖了iOS开发、Mac开发以及相关技术领域的335个关键点。CocoaChina作为中国最大的iOS开发者社区,其资源丰富,...
cocoachina 微信号
在《The Swift Programming Language中文完整版(CocoaChina精校)》中,你将获得更深入的Swift知识: 1. **高级类型**:深入理解枚举的关联值、原始值,以及结构体和类的扩展。 2. **协议与扩展**:学习协议的...
Core Animation是一种高级的动画框架,它利用Core Graphics和OpenGL ES来实现流畅的2D和3D动画效果。 总之,iOS绘图涉及的技术广泛且深奥,从简单的图形绘制到复杂的动画实现,都需要对Core Graphics、Quartz 2D、...
实现 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 ...
《Apple Swift编程语言入门教程.docx》可能涵盖了以下Swift语言的基础知识点: 1. **变量与常量**:Swift中使用`var`声明变量,`let`声明常量,它们都要求在声明时初始化,确保了代码的严谨性。 2. **类型系统**:...
在“iOS Mac.OS.X cocoachina知识点整理 part02”这个资源中,我们可以期待学习到一系列关于iOS和Mac OS X开发的重要概念和技术。CocoaChina作为一个知名的开发者社区,提供了丰富的教程和资料,帮助开发者深入理解...
整体而言,《The Swift Programming Language中文完整版(CocoaChina精校)》是对Swift编程语言一个全面而深入的介绍,适合作为初学者入门以及老手进阶的学习资料。文档不仅提供了理论知识,还通过实际的代码示例,...
《Swift编程语言中文完整版(CocoaChina精校)》是Swift初学者的重要参考资料,它由CocoaChina团队整理并精校,旨在帮助开发者更好地理解和掌握Apple的这门强大编程语言。本文将深入探讨其中的基础部分,包括常量和...