`
shfzhzhr
  • 浏览: 70764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UIView and CALayer

    博客分类:
  • IOS
 
阅读更多

 

 

研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍。苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的。今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情。鉴于Core Animation的内容实在是非常繁杂,应用的Obj-C语言本身的特性也很多,所以写个备忘录记录一下,懂的人看了后如果发现了错误,还不吝指教。

1.UIView 是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部 分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等, 实际上内部都是在访问它所包含的CALayer的相关属性。

2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过
1
- (class) layerClass {
2
  return ([CAEAGLLayer class]);
3
}
使某个UIView的子类使用GL来进行绘制。

3.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。例如下面的代码
1
grayCover = [[CALayer alloc] init];
2
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
3
[self.layer addSubLayer: grayCover];
会在目标View上敷上一层黑色的透明薄膜。

4.UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。
第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。

5.动画的运作
UIView 的主layer以外(我觉得是这样),对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成,动画持续时间有个缺省时间, 个人感觉大概是0.5秒。在动画时间里,系统自动判定哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧然后连续显示产生动画效果。

6.坐标系系统(对position和anchorPoint的关系还是犯晕)
CALayer 的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1,也就是按照比例来设 置。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。
某layer.anchorPoint = CGPointMake(0.f, 0.f);
如果这么设置,layer的左上角就会被挪到原来的中间的位置,
加上这样一句就好了
某layer.position = CGPointMake(0.f, 0.f);

7.真实例子的分析

   
这 是iphone上iBook翻页的效果,假设每一页都是一个UIView,我觉得一个页面是贴了俩个Layer,文字Layer显示正面的内容,背面 layer用文字layer的快照做affine翻转,贴在文字layer的后面。因为Layer可以设置显示阴影,也许后面的阴影效果没有使用单独的一 个layer来显示。至于这个曲面效果,我查了很多资料也没有结果,估计是使用了GL的曲面绘图?

8.最后一个让人恶心的。
layer 可以设置圆角显示,例如UIButton的效果,也可以设置阴影显示,但是如果layer树中的某个layer设置了圆角,树中所有layer的阴影效果 都将显示不了了。如果既想有圆角又想要阴影,好像只能做两个重叠的UIView,一个的layer显示圆角,一个的layer显示阴影.....

 

 

 

 

 

CALayer属于Core Animation部分的内容,比较重要而不太好理解。以下是园子中看到的一篇文章的摘录:

 

1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。

 

2. UIView有个重要属性layer,可以返回它的主CALayer实例。

 

// 要访问层,读取UIView实例的layer属性
CALayer *layer = myView.layer

 

所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。
UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:

 

- (class)layerClass {
   return ([CAEAGLLayer class]);
}

 

上述代码使得某个UIView的子类使用GL来进行绘制。

 

3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:

 

grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer:grayCover];

 

上述代码会在目标View上敷上一层黑色透明薄膜的效果。

 

4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。

 

5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。

 

6. 坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
某layer.anchorPoint = CGPointMake(0.f,0.f);
如果这么设置,只会将layer的左上角被挪到原来的中间位置,必须加上这一句:
某layer.position = CGPointMake(0.f,0.f);

 

最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影 (shadowColor)。但是如果layer树中某个 layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer 显示圆角,一个layer显示阴影......

 

7.渲染当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。

 

[gameLayer setNeedsDisplay];

 

若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:

 

[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];

 

如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。

 

[gameLayer renderInContext:UIGraphicsGetCurrentContext()];

 

8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。

 

characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);

CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform = transform;

9.变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。

分享到:
评论

相关推荐

    iPhone Chart XCode Project and Source Code

    在Objective-C中,这通常通过自定义UIView或CALayer来实现,需要计算每个扇区的角度和位置,并进行相应的绘图。 5. **线图(Line Chart)**:线图用于显示数据的变化趋势,常用于时间序列数据。实现线图可能涉及到...

    core animation 练习

    10. **Core Animation与UIKit的关系**: 在UIKit中,UIView和CALayer有紧密关联,UIView的动画通常是通过Core Animation底层实现的。开发者可以直接操作CALayer,也可以使用UIView的便捷动画方法。 通过"zonble-...

    CoreAnimation_guide

    Each UIView has an associated CALayer, and you can also create additional layers to represent more complex graphical elements. 2. **Animating Layer Properties:** Animating changes to layer ...

    使用POP类库做的开源动画库 iOS

    在Objective-C或Swift中,你可以为任何对象的属性定义动画,这包括UIKit中的UIView、CALayer等。POP提供了POPAnimatable协议,使得自定义类也能支持动画。通过实现该协议,开发者可以轻松地为自定义视图添加动画功能...

    教你使用coreAnimation

    每个UIView都有一个与之关联的CALayer,你可以直接操作Layer来改变其外观和行为。例如,调整Layer的frame可以改变视图的位置和大小,设置backgroundColor属性可以改变背景颜色,利用borderWidth和borderColor可以...

    iosAnimationDemo

    - Reversed and repeated animations:可以设置动画反转或重复执行。 3. **Core Animation与UIView animations**: - UIView animations是对Core Animation的简单封装,适用于简单动画,如渐变、淡入淡出等。 - ...

    ios-阴影遮罩.zip

    高效的阴影和遮罩渲染可能涉及到了`CALayer`的使用,因为`CALayer`可以直接在GPU上进行渲染,比单纯使用`UIView`在CPU上的绘制更加高效。 9. **内存管理** 对于自定义视图,内存管理也是重要的一环。开发者可能会...

    Core Animation for Mac OS X and the iPhone 英文版

    《Core Animation for Mac OS X and the iPhone》是深入探讨苹果平台动画技术的重要参考资料,主要针对Mac OS X和iOS操作系统。Core Animation是Apple提供的一种强大的图形渲染和动画框架,它允许开发者创建流畅、...

    iOS界面动画大全

    10. **Reversing and Repeating Animations**: 动画可以设置为反向播放或无限循环,通过设置animation.repeatCount和animation.autoreverses属性实现。 11. **Layer Delegate**: CALayer的代理可以监听动画的开始和...

    iOS Animations by Tutorials iOS 12 and Swift 4.2, 5th Edition_code 源代码

    Core Animation层(CALayer)支持弹簧动画,通过设置spring damping和initial velocity参数,可以调整动画的缓动效果和速度。 2. **20-getting-started-with-uiviewpropertyanimator**:UIViewPropertyAnimator是...

    Iphone and ipod touch Programing 的源代码

    源代码可能会包括CAAnimation、CALayer的使用,以及自定义UIView动画的实现。 7. **通知与代理**: iOS中的NSNotification和代理模式是组件间通信的主要方式。代码示例可能涵盖如何发布、监听通知,以及实现委托方法...

    IOS应用源码——动画.zip

    3. **UIView Animations**: UIView类提供了一些简化的动画接口,如`+[UIView animateWithDuration:animations:]`和`+[UIView transitionWithView:duration:options:animation:completion:]`,这些方法使得创建基本的...

    ios应用源码之动画 2018127

    Core Animation基于图层(CALayer)工作,通过修改图层属性并利用硬件加速来实现流畅的动画效果。 2. **CAAnimation**: CAAnimation是Core Animation中最基础的动画类,用于添加非交互式的动画到图层。例如,你可以...

    Tumblr Menu

    4. **UIView animations**:虽然主要依赖CoreAnimation,但开发者可能也结合了UIView的动画API,如`animate(withDuration:animations:)`,以简化某些特定的动画逻辑。 5. **Block-based animations**:Core...

    [iOS的图像和动画处理].源代码

    8. **Animating and Rotating Views**:结合`UIView`的`animate(withDuration:animations:)`方法,可以轻松实现视图的旋转动画。 9. **Drawing Text**:iOS提供了`CoreText`框架来处理文本绘制,允许自定义字体、...

    iOS核心动画

    每个视图(UIView)在屏幕上显示的内容实际上都是由对应的CALayer对象管理的。CALayer负责存储图层的各种属性,如位置、大小、颜色等,并且独立于视图的其他属性。与视图不同的是,CALayer不处理用户的交互,而是...

    iphone核心动画

    - **基础层**:如`CALayer`,是所有层类的基类,提供了基本的图形绘制和动画支持。 - **特殊层**:如`CAEmitterLayer`用于粒子系统,`CATextLayer`用于文本渲染,提供更高级的特性和功能。 ### 3. Transformations ...

    iOS_Animations_by_Tutorials_v4.0内含所有章节的代码资源

    在iOS中,CALayer是UIView的基础,它提供了更多的动画特性。通过利用layer的spring属性,可以创建出逼真的物理效果,如弹簧振动和阻尼。 "17-custom-presentation-controller-and-device-orientation-animations...

    ios-画数字0-9.zip

    4. **描边和填充(Stroke and Fill)**:使用`CGContextSetLineWidth`设置线条宽度,`CGContextStrokePath`描边路径,`CGContextFillPath`填充路径。 5. **自定义视图(Custom UIView)**:如果你希望在应用中显示这些...

    iOS 5 Programming Cookbook 汉英and源代码

    7. **动画**:iOS的Core Animation框架使得创建平滑、动态的用户界面成为可能,理解CA Layer和CALayer之间的关系,以及如何创建自定义动画非常重要。 8. **推送通知**:远程通知是iOS应用与用户进行实时交互的重要...

Global site tag (gtag.js) - Google Analytics