??最近研究繪圖框架Core Graphics時(shí)妻味,無(wú)法避免的涉及到了drawRect:與drawLayer:InContext方法。
參考文章
iOS的繪圖之drawRect和drawLayer:inContext
通過(guò)這篇文章中對(duì)drawRect:以及drawLayer:InContext的實(shí)踐乍炉,再加上親自運(yùn)行文章中demo反復(fù)驗(yàn)證绢片。得出一下幾點(diǎn)結(jié)論:(結(jié)論大體上與參考文章一致,但也有自己的一些思考)
當(dāng)一個(gè)view被addSubview到其他view上時(shí)
1.?先隱式地把view的layer的CALayerDelegate設(shè)置為view岛琼。
2.?調(diào)用此view的layer的drawInContext方法底循。
3.?由于drawLayer:InContext方法的注釋?zhuān)篒f defined, called by the default implementation of -drawInContext: (如果被定義了,在方法drawInContext:默認(rèn)實(shí)現(xiàn)中被調(diào)用)
??說(shuō)明了drawInContext里if([self.delegate responseToSelector:@selector(drawLayer:inContext:)])時(shí)就執(zhí)行drawLayer:inContext:方法槐瑞,這里我們因?yàn)閷?shí)現(xiàn)了drawLayer:inContext:所以會(huì)執(zhí)行熙涤。
4.?[super drawLayer:layer inContext:ctx]會(huì)讓系統(tǒng)自動(dòng)調(diào)用此view的drawRect:方法。
至此困檩,view的隱式layer被繪制出來(lái)祠挫。
??但是這其中有一個(gè)很有意思的地方假如不重寫(xiě)drawRect:方法,view的隱式layer中的drawInContext是不會(huì)被調(diào)用的悼沿,個(gè)人猜測(cè)在該addSubview中做了處理等舔。(當(dāng)然假如你實(shí)在不想重寫(xiě)系統(tǒng)的drawRect:方法,你也可以用view的layer調(diào)用setNeedsDisplay方法去自己調(diào)用drawInContext方法)
5.?當(dāng)view得隱式layer繪制完成糟趾,系統(tǒng)將繼續(xù)繪制subLayer慌植。當(dāng)調(diào)用[layer setNeedsDisplay];時(shí)會(huì)自動(dòng)調(diào)用此layer的drawInContext方法。
PS:drawInContext方法不能手動(dòng)調(diào)用义郑,只能通過(guò)這個(gè)方法讓系統(tǒng)自動(dòng)調(diào)用
寫(xiě)在最后
框架學(xué)習(xí)中蝶柿,各種細(xì)小的知識(shí)點(diǎn),慢慢積累非驮,努力成長(zhǎng)=惶馈!劫笙!