layoutSubview的坑和drawRect分析

LayoutSubview使用中的坑


我們調(diào)用layoutsubview去刷新布局的方法是 [self.button setNeedsLayout]; ?這個(gè)方法是異步的勾缭,我們來看一下打印結(jié)果:


1.1


1.2

為什么是異步的呢?

因?yàn)閞unloop咽筋,這里涉及到runloop的源碼分析弊仪,這篇文章暫不展開分析但绕,后面會(huì)寫一篇關(guān)于runloop源碼分析的文章而柑。這里只需要知道:刷新布局的操作被標(biāo)記苟耻,被runloop放到一下個(gè)循環(huán)中執(zhí)行(試想一下蛤育,如果同步宛官,那么我有多個(gè)view的setNeedsLayout要執(zhí)行的情況下,性能開銷相對(duì)比較大)runloop在下一個(gè)循環(huán)中處理所有的本次循環(huán)標(biāo)記的刷新布局操作瓦糕。

如何同步底洗?


1.4
1.5

setNeedsLayout

layoutIfNeeded

只需要這兩句一起執(zhí)行



drawRect分析

CGContextRef context = UIGraphicsGetCurrentContext();

當(dāng)我們?cè)赿rawrect中想要繪畫內(nèi)容時(shí),首先會(huì)獲取我們常說的“上下文”

那么這個(gè)上下文是什么呢咕娄?

這里我們先來看一下這兩句代碼

UIGraphicsPopContext();

看一下這句代碼的描述


1.6

從堆棧頂部刪除當(dāng)前圖形上下文亥揖,恢復(fù)先前的上下文。

使用此功能可以平衡對(duì)UIGraphicsPushContext函數(shù)的調(diào)用圣勒。

可以從應(yīng)用程序的任何線程調(diào)用此函數(shù)费变。

我們的圖形上下文,是存放在系統(tǒng)的一個(gè)專門用來存放上下的堆棧中圣贸,系統(tǒng)在drawrect方法中挚歧,會(huì)將此view的上下文推到這個(gè)堆棧中。所以吁峻,在drawrect中滑负,獲取當(dāng)前上下文,可以獲取到和這個(gè)view所關(guān)聯(lián)的上下文用含,繼而操作矮慕。我們做一個(gè)小實(shí)驗(yàn):


可以看到,只有在view的drawrect方法中啄骇,存放上下文的棧才會(huì)有當(dāng)前上下文痴鳄,也證實(shí)了?系統(tǒng)在drawrect方法中,會(huì)將此view的上下文推到這個(gè)堆棧中 ? 這個(gè)結(jié)論

UIGraphicsPushContext(nil);

這句代碼缸夹,則是將某個(gè)上下文痪寻,推到存放上下文的棧里。

正常情況下虽惭,我們不會(huì)調(diào)用這兩句代碼槽华,在drawrect中我們就可以獲取到當(dāng)前上下文,不會(huì)pop / push

那么context 上下文趟妥,影響的是什么呢?

影響的是CALayer

?我們?cè)谏舷挛闹械牟僮饔度兀紩?huì)渲染到當(dāng)然view的layer中



延伸1:view和layer的關(guān)系是什么

簡(jiǎn)而言之:我們屏幕上所看到的視覺效果披摄,是CAlayer所展現(xiàn)出來的亲雪。而view只是負(fù)責(zé)管理CAlayer的,UIView是繼承UIResponder的疚膊,是用來負(fù)責(zé)響應(yīng)交互的义辕。

延伸2:IB_DESIGNBLE

一個(gè)有意思的可視化:


可以在xib中看到所修飾的view的當(dāng)前calayer的層次,也就是說在這個(gè)view上加個(gè)button寓盗,再在button的drawrect中繪制灌砖,是看不到的。


正在學(xué)習(xí)~有問題請(qǐng)指出?觥基显!多謝~~~~~~~



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市善炫,隨后出現(xiàn)的幾起案子撩幽,更是在濱河造成了極大的恐慌,老刑警劉巖箩艺,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窜醉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艺谆,警方通過查閱死者的電腦和手機(jī)榨惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静汤,“玉大人琅催,你說我怎么就攤上這事∪雎瑁” “怎么了恢暖?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狰右。 經(jīng)常有香客問我杰捂,道長(zhǎng),這世上最難降的妖魔是什么棋蚌? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任嫁佳,我火速辦了婚禮,結(jié)果婚禮上谷暮,老公的妹妹穿的比我還像新娘蒿往。我一直安慰自己,他們只是感情好湿弦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布瓤漏。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔬充。 梳的紋絲不亂的頭發(fā)上蝶俱,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音饥漫,去河邊找鬼榨呆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛庸队,可吹牛的內(nèi)容都是我干的积蜻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼彻消,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竿拆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起证膨,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤如输,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后央勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體不见,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年崔步,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稳吮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪么。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盘榨,死狀恐怖鉴逞,靈堂內(nèi)的尸體忽然破棺而出祠丝,到底是詐尸還是另有隱情,我是刑警寧澤杠氢,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布氯哮,位于F島的核電站掂碱,受9級(jí)特大地震影響者甲,放射性物質(zhì)發(fā)生泄漏春感。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一虏缸、第九天 我趴在偏房一處隱蔽的房頂上張望鲫懒。 院中可真熱鬧,春花似錦刽辙、人聲如沸窥岩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂翼。三九已至晃洒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疚鲤,已是汗流浹背锥累。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留集歇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓语淘,卻偏偏與公主長(zhǎng)得像诲宇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惶翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容