美文网首页iOS 你不知道的还很多
iOS 中drawRect与drawLayer:InContex

iOS 中drawRect与drawLayer:InContex

作者: 雪中夜归人 | 来源:发表于2018-01-24 16:01 被阅读218次

      最近研究绘图框架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方法不能手动调用,只能通过这个方法让系统自动调用

    写在最后

    框架学习中,各种细小的知识点,慢慢积累,努力成长!!!

    相关文章

      网友评论

        本文标题:iOS 中drawRect与drawLayer:InContex

        本文链接:https://www.haomeiwen.com/subject/bleuaxtx.html