最近研究绘图框架Core Graphics时,无法避免的涉及到了drawRect:与drawLayer:InContext方法。
参考文章
iOS的绘图之drawRect和drawLayer:inContext
通过这篇文章中对drawRect:以及drawLayer:InContext的实践,再加上亲自运行文章中demo反复验证。得出一下几点结论:(结论大体上与参考文章一致,但也有自己的一些思考)
当一个view被addSubview到其他view上时
1. 先隐式地把view的layer的CALayerDelegate设置为view。
2. 调用此view的layer的drawInContext方法。
3. 由于drawLayer:InContext方法的注释:If defined, called by the default implementation of -drawInContext: (如果被定义了,在方法drawInContext:默认实现中被调用)
说明了drawInContext里if([self.delegate responseToSelector:@selector(drawLayer:inContext:)])时就执行drawLayer:inContext:方法,这里我们因为实现了drawLayer:inContext:所以会执行。
4. [super drawLayer:layer inContext:ctx]会让系统自动调用此view的drawRect:方法。
至此,view的隐式layer被绘制出来。
但是这其中有一个很有意思的地方假如不重写drawRect:方法,view的隐式layer中的drawInContext是不会被调用的,个人猜测在该addSubview中做了处理。(当然假如你实在不想重写系统的drawRect:方法,你也可以用view的layer调用setNeedsDisplay方法去自己调用drawInContext方法)
5. 当view得隐式layer绘制完成,系统将继续绘制subLayer。当调用[layer setNeedsDisplay];时会自动调用此layer的drawInContext方法。
PS:drawInContext方法不能手动调用,只能通过这个方法让系统自动调用
写在最后
框架学习中,各种细小的知识点,慢慢积累,努力成长!!!