1.内容管理和绘制
UIView主要是对显示内容的管理,而CALayer主要是对显示的绘制
2.所属框架及响应事件
两者所属的框架不同:UIView属于UIKit框架,而CALayer是QuartzCore框架下的,UIView可以响应事件,而layer不能,这也是两者最明显的区别。
3.UIView和layer的frame
一个layer的frame是由它的anchorPoint,position,bounds和transform共同决定的,而一个view的frame只是简单返回layer的frame,同样view的bounds和center也睡返回layer的一些属性。
4.隐式动画
每个view都有一个layer,但是有一些不依附view单独存在的layer,如CAShapelayer,它们不需要附加到view上就可以在屏幕上显示内容。
基本上我们改变一个layer的任何一个属性时,都会触发一个从旧值到新值的简单动画,这就是所谓的隐式动画。但是,当layer附加到view中时,这个隐式动画就不起作用了。
UIView默认情况下禁止了layer动画,但是在animation block中又重新启用了它们。因为任何可动画的layer属性改变时,layer都会寻找并运行合适的action来实行这个改变,这个动画在Core Animation中就是CAAction。
layer通过向它的delegate发送actionForLayer:forKey:消息来询问提供一个对应属性变化的action。
/* An object that will receive the CALayer delegate methods defined
* below (for those that it implements). The value of this property is
* not retained. Default value is nil. */
@property(nullable, weak) id <CALayerDelegate> delegate;
/* If defined, called by the default implementation of the
* -actionForKey: method. Should return an object implementing the
* CAAction protocol. May return 'nil' if the delegate doesn't specify
* a behavior for the current event. Returning the null object (i.e.
* '[NSNull null]') explicitly forces no further search. (I.e. the
* +defaultActionForKey: method will not be called.) */
- (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;
delegate可以通过返回以下三者之一来进行响应:
1.返回一个动作对象,这种情况下layer将使用这个动作
2.返回nil,这样layer会到其他地方寻找
3.返回NSNull 对象,告诉layer这里不需要执行一个动作,搜索也会就此停止
当layer在背后支持一个view的时候,view就是它的delegate。