前面总结了那么多CALayer的属性和知识点,我们来理一理这货究竟和UIView的区别和联系是什么,这也是面试常常有的难题!!
一番搜索,找到一个很多的解析:http://www.jianshu.com/p/079e5cf0f014 , 大牛就是大牛!
先看看大神怎么总结的:
根据文顶顶大神的教程,我们可以知道UIView作为CALayer的管理者,之所以能够显示内容,是因为CALayer层在屏幕的的绘制。而UIView继承UIResponder类,具备事件响应的能力,CALayer不具备,但是由于轻量的原因性能上更高
这里我们对比一下UIView CALayer 常见的相似的属性和方法:
1.
2.
3.
4.
5.
6.
当然还有其他非常相似的属性和方法,我们先不做细纠了
按照大牛的方法来我们继承两个UIView 和 CALayer 类,并重写UIView里面 layClass方法,跟踪到底两者关系和发生了什么事情!
.h文件:
#import <UIKit/UIKit.h>
@interface CustomerView : UIView
@end
#pragma mark - CustomerLayer.
@interface CustomerLayer : CALayer
@end
#import "CustomerView.h"
@implementation CustomerView
- (id)init
{
self = [super init];
if (self)
{
NSLog(@"CustomerCustomer init");
}
return self;
}
+ (Class)layerClass
{
return [CustomerLayer class];
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
}
- (void)setCenter:(CGPoint)center
{
[super setCenter:center];
}
- (void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
}
- (void)setBackgroundColor:(UIColor *)backgroundColor
{
[super setBackgroundColor:backgroundColor];
}
@end
#pragma mark - CustomerLayer.
@implementation CustomerLayer
- (instancetype) init
{
self = [super init];
if (self)
{
NSLog(@"CustomerLayer init");
}
return self;
}
+ (instancetype) layer
{
return [CustomerLayer layer];
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
}
- (void)setPosition:(CGPoint)position
{
[super setPosition:position];
}
- (void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
}
- (void)setBackgroundColor:(CGColorRef)backgroundColor
{
[super setBackgroundColor:backgroundColor];
}
@end
在上面每一个方法都打一个断点,可以发现,调用顺序大致如下:
init(UIView) -> layerClass(UIView) -> init(CALayer) -> setBounds(CALayer) -> setFrame(CALayer)*2 -> setPosition(CALayer) -> setBounds(CALayer) -> 开始弹出界面
当调用到layer创建了类之后我们可以看到:
可以看到UIView调用了一个私有方法,为什么是私有方法呢?因为在头文件是看不到这个方法的!根据语义上可以知道:根据Frame来创建Layer,而且这个方法的调用顺序在layerClass之后。
所以大神就猜测到UIView的setCenter 和 setBounds是不是直接根据它自身的CALayer的setPosition 和 setBounds来实现的呢?这个回想起,如果你直接setBounds和setCenter会错位,是不是一个道理?这也是iOS的不足,我们往往难以知道源码(闭源),从而难以像安卓一样知道源码实现,这个可以参考一下iOS的逆向工程
摘抄一段:
View中frame getter方法,bounds和center,UIView并没有做什么工作;它只是简单的各自调用它底层的CALayer的frame,bounds和position方法。
道理
参考:
http://www.jianshu.com/p/079e5cf0f014
http://www.cocoachina.com/industry/20131209/7498.html