【IOS 知識點】 視圖&圖像相關(guān)

Auto Layout 原理

Auto Layout是一種全新的布局方式,它采用一系列約束(constraints)來實現(xiàn)自動布局工猜,當(dāng)你的屏幕尺寸發(fā)生變化或者屏幕發(fā)生旋轉(zhuǎn)時米诉,可以不用添加代碼來保持原有布局不變,實現(xiàn)視圖的自動布局篷帅。

所謂約束史侣,通常是定義了兩個視圖之間的關(guān)系(當(dāng)然你也可以一個視圖自己跟自己設(shè)定約束)拴泌。如下圖就是一個約束的例子,當(dāng)然要確定一個視圖的位置惊橱,跟基于frame一樣蚪腐,也是需要確定視圖的橫縱坐標(biāo)以及寬度和高度的,只是税朴,這個橫縱坐標(biāo)和寬度高度不再是寫死的數(shù)值削茁,而是根據(jù)約束計算得來,從而達到自動布局的效果掉房。

UIView之drawRect: & layoutSubviews的作用和機制

drawRect 調(diào)用機制

1茧跋、調(diào)用時機:loadView ->ViewDidload ->drawRect:
2、如果在UIView初始化時沒有設(shè)置rect大小卓囚,將直接導(dǎo)致drawRect:不被自動調(diào)用瘾杭。
3、通過設(shè)置contentMode屬性值為UIViewContentModeRedraw哪亿。那么將在每次設(shè)置或更改frame的時候自動調(diào)用drawRect:粥烁。
4、直接調(diào)用setNeedsDisplay蝇棉,或者setNeedsDisplayInRect:觸發(fā)drawRect:讨阻,但是有個前提條件是:view當(dāng)前的rect不能為nil

5、該方法在調(diào)用sizeThatFits后被調(diào)用篡殷,所以可以先調(diào)用sizeToFit計算出size钝吮。然后系統(tǒng)自動調(diào)用drawRect:方法。
這里簡單說一下sizeToFit和sizeThatFit:
sizeToFit:會計算出最優(yōu)的 size 而且會改變自己的size
sizeThatFits:會計算出最優(yōu)的 size 但是不會改變 自己的 size

注意事項

1板辽、若使用UIView繪圖奇瘦,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取到一個invalidate的ref保存下來劲弦,在drawRect中并不能用于畫圖耳标。等到在這里調(diào)用時,可能當(dāng)前上下文環(huán)境已經(jīng)變化邑跪。
2次坡、若使用CALayer繪圖,只能在drawInContext: 中(類似于drawRect)繪制画畅,或者在delegate中的相應(yīng)方法繪制砸琅。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法。
3夜赵、若要實時畫圖明棍,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實時刷新屏幕寇僧。
4摊腋、UIImageView繼承自UIView,但是UIImageView能不重寫drawRect方法用于實現(xiàn)自定義繪圖沸版。具體原因如下:
Apple在文檔中指出:UIImageView是專門為顯示圖片做的控件,用了最優(yōu)顯示技術(shù)兴蒸,是不讓調(diào)用darwrect方法视粮, 要調(diào)用這個方法,只能從uiview里重寫橙凳。

layoutSubviews

這個方法是用來對subviews重新布局蕾殴,默認(rèn)沒有做任何事情,需要子類進行重寫岛啸。
當(dāng)我們在某個類的內(nèi)部調(diào)整子視圖位置時钓觉,需要調(diào)用。
反過來的意思就是說:如果你想要在外部設(shè)置subviews的位置坚踩,就不要重寫荡灾。

①、- (void)layoutSubviews;
對subview重新布局
②瞬铸、- (void)setNeedsLayout;
將視圖標(biāo)記為需要重新布局批幌, 這個方法會在系統(tǒng)runloop的下一個周期自動調(diào)用layoutSubviews。
③嗓节、- (void)layoutIfNeeded;
如果有需要刷新的標(biāo)記荧缘,立即調(diào)用layoutSubviews進行布局(如果沒有標(biāo)記,不會調(diào)用layoutSubviews)這里注意一個點:標(biāo)記拦宣,沒有標(biāo)記截粗,即使我們掉了該函數(shù)也不起作用
如果要立即刷新恢着,要先調(diào)用[view setNeedsLayout]桐愉,把標(biāo)記設(shè)為需要布局财破,然后馬上調(diào)用[view layoutIfNeeded]掰派,實現(xiàn)布局.
在視圖第一次顯示之前,標(biāo)記總是“需要刷新”的左痢,可以直接調(diào)用[view layoutIfNeeded]

這里有必要描述下三者之間的關(guān)系:
在沒有外界干預(yù)的情況下靡羡,一個view的frame或者bounds發(fā)生變化時,系統(tǒng)會先去標(biāo)記flag這個view,等下一次渲染時機到來時(也就是runloop的下一次循環(huán))俊性,會去按照最新的布局去重新布局視圖略步。
setNeedLayout就是給這個view添加一個標(biāo)記,告訴系統(tǒng)下一次渲染時機需要重新布局這個視圖定页。
layoutIfNeed就是告訴系統(tǒng)趟薄,如果已經(jīng)設(shè)置了flag,那不用等待下個渲染時機到來典徊,立即重新渲染杭煎。前提是設(shè)置了flag恩够。
layoutSubviews則是由系統(tǒng)去調(diào)用,不需要我們主動調(diào)用羡铲,我們只需要調(diào)用layoutIfNeed蜂桶,告訴系統(tǒng)是否立即執(zhí)行重新布局的操作。

layoutSubviews調(diào)用時機

結(jié)論是經(jīng)過搜索得到的也切,基于此筆者進行了驗證扑媚,并得到了些結(jié)果:
1、init初始化不會觸發(fā)layoutSubviews雷恃。
2疆股、addSubview會觸發(fā)layoutSubviews。(當(dāng)然這里frame為0倒槐,是不會調(diào)用的押桃,同上面的drawrect:一樣)
3、設(shè)置view的Frame會觸發(fā)layoutSubviews导犹,(當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化唱凯。)
4、滾動一個UIScrollView會觸發(fā)layoutSubviews谎痢。
5磕昼、旋轉(zhuǎn)屏幕會觸發(fā)父UIView上的layoutSubviews事件。(這個我們開發(fā)中會經(jīng)常遇到节猿,比如屏幕旋轉(zhuǎn)時票从,為了界面美觀我們需要修改子view的frame,那就會在layoutSubview中做相應(yīng)的操作)
6滨嘱、改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews事件峰鄙。
7、直接調(diào)用setLayoutSubviews太雨。(Apple是不建議這么做的)

這里需要補充一點:layoutSubview是布局相關(guān)吟榴,而drawRect則是負(fù)責(zé)繪制。因此從調(diào)用時序上來講囊扳,layoutSubviews要早于drawRect:函數(shù)吩翻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锥咸,隨后出現(xiàn)的幾起案子狭瞎,更是在濱河造成了極大的恐慌,老刑警劉巖搏予,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機碗殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門劣针,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亿扁,你說我怎么就攤上這事捺典。” “怎么了从祝?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵襟己,是天一觀的道長。 經(jīng)常有香客問我牍陌,道長擎浴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任毒涧,我火速辦了婚禮贮预,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘契讲。我一直安慰自己仿吞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布捡偏。 她就那樣靜靜地躺著唤冈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪银伟。 梳的紋絲不亂的頭發(fā)上你虹,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音彤避,去河邊找鬼傅物。 笑死,一個胖子當(dāng)著我的面吹牛琉预,可吹牛的內(nèi)容都是我干的董饰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼模孩,長吁一口氣:“原來是場噩夢啊……” “哼尖阔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榨咐,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谴供,沒想到半個月后块茁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年数焊,在試婚紗的時候發(fā)現(xiàn)自己被綠了永淌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佩耳,死狀恐怖遂蛀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情干厚,我是刑警寧澤李滴,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛮瞄,受9級特大地震影響所坯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挂捅,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一芹助、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闲先,春花似錦状土、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至退盯,卻和暖如春彼乌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渊迁。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工慰照, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琉朽。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓毒租,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箱叁。 傳聞我的和親對象是個殘疾皇子墅垮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 前言: 最近公司項目不怎么忙, 閑暇時間把iOS 在面試中可能會遇到的問題整理了一番, 一部分題目是自己面試遇到...
    Leon_520閱讀 7,033評論 3 45
  • 這部分主要講一下UI視圖和圖像相關(guān)的技術(shù)點,大致包括以下內(nèi)容 UI事件傳遞&響應(yīng) UI圖像顯示原理 UI卡頓,掉幀...
    theonelgq閱讀 373評論 0 1
  • 可否使用 == 來判斷兩個NSString類型的字符串是否相同耕漱?為什么算色? 不能。==判斷的是兩個變量的值的內(nèi)存地址...
    漸z閱讀 607評論 0 0
  • layoutSubviews 這個方法螟够,默認(rèn)沒有做任何事情灾梦,需要子類進行重寫峡钓。 (This method) Lay...
    我是不是叫沒煩惱閱讀 688評論 0 0
  • 原文出自別人之手,只做個人記錄而已若河! Layout相關(guān)方法小結(jié) - (CGSize)sizeThatFits:(C...
    安靜的抉擇閱讀 321評論 0 0