IOS----Core Animation介绍2

来源:互联网 发布:php快递查询源码 编辑:程序博客网 时间:2024/06/05 19:58

http://superman474.blog.163.com/blog/static/12066146201185755254/

Layer-Tree 结构

虽然layer的直接责任是提供可视的内容和管理动画,但是layer还作为其他layers的容器,创建一个layer结构。此篇就主要讲述layer的结构层次,以及我们如何在这结构层次中操纵layers。

1.core animation中的layer-tree和cocoa view的hierarchy相似。就像是UIView实例有superview和subviews一样,一个core Animation layer也有superlayer和sublayers。layer-tree提供了很多好处:
   复杂的界面可以有简单的layers组装而成,此避免了单一复杂的子类。
   meiyigelayer声明自己的坐标系统相对于其superlayer的坐标系统,当一个layer转换时,其sublayers跟着转换。
   一个layer-tree是动态的。当应用程序运行的时候它可以被重新配置。layer可以创建,添加作为另一个layer的sublayer,或者另外一个。然后从layer-tree上移除。

2.在views上显示layers
   core Animation没有提供一个实际用于显示layer的窗口,layers必须属于一个view。当与view配对时,view必须提供事件处理,而layers提供内容的显示。
   IOS的view 系统直接建立在core animation layer顶部,每一个UIView的实例会自动创建一个CALayer类实例,并设置它为view的layer属性的值。我们可以根据需要给view的layer添加sublayer。
   
3.在结构层次中添加和移除layers
   下面这个几个方法就是用来操纵layer-tree的通用方法
    addSublayer:    insertSublayer:atIndex:         insertSublayer:below:
    insertSublayer:above:    removeFromSuperlayer:            replaceSublayer:with:
   缺省情况下,从一个可视的layer-tree上面插入或者删除layers时,会触发一个动画。当layer作为一个sublayer添加时,父 layer返回一个动画用KCAOnOrderIn标识被触发。当一个layer被删除,父layer动画标记为KCAOnOraderOut被触发,当 更换一个layer,父layer标记为KCATransition的动画被触发返回。在操纵layer-tree时,可以禁用这些动画,或者使用任何 action identifier去改变动画。

4.重定位(repositioning)或者调整(resizing)layers
    当一个layer被创建之后,可以通过程序移动和调整layer的几何属性:frame,bounds,position,anchorPoint或者zPosition。
    如果layer的属性needsDisplayOnBoundsChange 为YES,layer的内容在layer bounds改变时从新绘制,即bounds改变时调用setNeedsDisplay。缺省为NO。
    缺省的改变frame,bounds,position,anchorPoint和zPosition属性会引起layer动画。
自动调整layers
    CALayer提供了一个机制用来在superlayer被移动或者调整大小时自动的去移动和调整sublayer。在大多数情况下简单的配置layer的autoresizing mask就能达到恰当的效果。
    layer的autoresizing mask是用CAAutoresizingMask常量合并的。共六个:

Layer autoresizing mask constants
上图是对于mac ox下面的坐标,ios下面的稍微不同。
  上图中,当那一个变量被移除,则在哪个地方layer保持固定。
一个CALayer的子类可以覆盖resizeSublayersWithOldSize:和resizeWithOldSuperlayerSize:去自定义layer的autoresizeing行为。当一个layer的bounds属性改变时,resizeSublayersWithOldSize:方法会被自动的调用,并给每一个sublayer发送resizeWithOldSuperlayerSize:消息。

   5.剪裁sublayers
   Example Values of the masksToBounds property
和UIView一样,masksToBounds 属性缺省为NO。