layoutSubviews、drawRect與sizeToFit

1.layoutSubviews
官方說明:
這個(gè)方法季眷,默認(rèn)沒有做任何事情余蟹,子類可以根據(jù)需要覆蓋此方法,以執(zhí)行其子視圖的更精確布局瘟裸。
您不應(yīng)該直接調(diào)用此方法客叉。 如果要強(qiáng)制進(jìn)行布局更新,請(qǐng)?jiān)谙麓卫L圖更新之前調(diào)用setNeedsLayout方法话告。
如果要立即更新視圖的布局兼搏,請(qǐng)調(diào)用layoutIfNeeded方法。
調(diào)用時(shí)機(jī):
1.init初始化不會(huì)觸發(fā)layoutSubviews沙郭;但是是用initWithFrame 進(jìn)行初始化時(shí)佛呻,當(dāng)rect的值不為CGRectZero時(shí), addSubview也會(huì)觸發(fā)
2.addSubview會(huì)觸發(fā)layoutSubviews
3.設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化(因此在layoutSubviews中設(shè)置frame不會(huì)造成循環(huán));
4.滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews
5.旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件
6.單純改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件
7.setNeedsLayout方法(異步)病线、-layoutIfNeeded方法(馬上)會(huì)調(diào)用layoutSubviews進(jìn)行布局
總結(jié):layoutSubviews, 當(dāng)我們?cè)谀硞€(gè)類的內(nèi)部調(diào)整子視圖位置時(shí)吓著,需要調(diào)用。反過來的意思就是說:如果你想要在外部設(shè)置subviews的位置送挑,就不要重寫绑莺。
-layoutSubviews方法:這個(gè)方法,默認(rèn)沒有做任何事情惕耕,需要子類進(jìn)行重寫
-setNeedsLayout方法: 標(biāo)記為需要重新布局纺裁,異步調(diào)用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會(huì)被調(diào)用
-layoutIfNeeded方法:如果欺缘,有需要刷新的標(biāo)記栋豫,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒有標(biāo)記,不會(huì)調(diào)用layoutSubviews)
如果要立即刷新谚殊,要先調(diào)用[view setNeedsLayout]丧鸯,把標(biāo)記設(shè)為需要布局,然后馬上調(diào)用[view layoutIfNeeded]嫩絮,實(shí)現(xiàn)布局丛肢。
layoutSubviews方法調(diào)用先于drawRect


2.drawRect:(CGRect)rect執(zhí)行重繪任務(wù)
可以在UIView(UIViewRendering)的方法- (void)drawRect:(CGRect)rect;中去繪制一些我們所需要的圖形,如虛線絮记、圓形摔踱、方形以及曲線等等圖形 ,重寫此方法怨愤,執(zhí)行重繪任務(wù)。
調(diào)用時(shí)機(jī):
1蛹批、如果在UIView初始化時(shí)沒有設(shè)置rect大小撰洗,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用;在子類初始化時(shí)調(diào)用- (instancetype)initWithFrame:(CGRect)frame方法腐芍,且frame不為CGRectZero時(shí)會(huì)調(diào)用
2差导、該方法在調(diào)用sizeThatFits后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size猪勇。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法设褐。
3、通過設(shè)置contentMode屬性值為UIViewContentModeRedraw泣刹。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:助析。
4、直接調(diào)用setNeedsDisplay椅您,或者setNeedsDisplayInRect:觸發(fā)drawRect:外冀,但是有個(gè)前提條件是rect不能為0.
5、drawRect是在Controller->loadView, Controller->viewDidLoad之后會(huì)自動(dòng)調(diào)用掀泳,調(diào)用時(shí)機(jī)是在viewWillAppear和viewDidAppear之間
使用說明:
只能在繼承了UIView的子類中通過重寫drawRect方法來繪制圖形雪隧; 如果需要繪制圖形的子類直接繼承自UIView,則子類的drawRect方法中不需要調(diào)用父類方法[super drawRect:rect]员舵;如果子類繼承自其他繼承UIView的View類脑沿,則drawRect方法中需要調(diào)用父類方法[super drawRect:rect];
補(bǔ)充:
-setNeedsDisplay方法:標(biāo)記為需要重繪马僻,異步掉用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:標(biāo)記為需要局部重繪
比較:
layoutSubviews對(duì)subviews重新布局庄拇;drawRect是對(duì)receiver的重繪,能獲得context巫玻;
layoutSubviews方法調(diào)用先于drawRect丛忆;
setNeedsLayout在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記祠汇,在系統(tǒng)runloop的下一個(gè)周期自動(dòng)調(diào)用layoutSubviews;layoutIfNeeded方法如其名熄诡,UIKit會(huì)判斷該receiver是否需要layout.
layoutIfNeeded遍歷的不是superview鏈可很,應(yīng)該是subviews鏈
setNeedDisplay在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記,在下一個(gè)draw周期自動(dòng)重繪凰浮,iphone device的刷新頻率是60hz我抠,也就是1/60秒后重繪。


3.sizeToFit: resize當(dāng)前view,使得它找到最適合自己的大小.通常是通過view內(nèi)容來確定它自己的大小.不要重寫這個(gè)方法.
sizeToFit會(huì)計(jì)算出最優(yōu)的 size 而且會(huì)改變自己的size
sizeThatFits: 會(huì)計(jì)算出最優(yōu)的 size 但是不會(huì)改變 自己的size
使用這兩個(gè)方法必須先給label賦值袜茧。
常用場(chǎng)景
UILabel中,先設(shè)置label view的width,然后使用sizeToFit,會(huì)根據(jù)內(nèi)部文字多少,自適應(yīng)返回當(dāng)前l(fā)abel的size,其中height就是系統(tǒng)自動(dòng)計(jì)算的.(ps:這里也可以用NSString的boundingRect方法計(jì)算文字寬高,然后設(shè)置給label)
UIImageView, 如果該imageView中有圖片,調(diào)用sizeToFit,返回的size就是內(nèi)部圖片的size
UISwitch, 這個(gè)控件的默認(rèn)size是固定的,調(diào)用以后返回默認(rèn)的size.(ps:如果需要改變大小,使用transform屬性)
navigationItem, 如果設(shè)置它使用customView時(shí)候,最好先調(diào)用sizeToFit
補(bǔ)充:UILabel中有一個(gè)關(guān)鍵屬性adjustsFontSizeToFitWidth,可以通過label的width反向自適應(yīng)設(shè)置字體的font.注意這個(gè)屬性需要配合baselineAdjustment=UIBaselineAdjustmentAlignCenters一起使用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菜拓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛厦,更是在濱河造成了極大的恐慌纳鼎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳凸,死亡現(xiàn)場(chǎng)離奇詭異贱鄙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姨谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門逗宁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梦湘,你說我怎么就攤上這事瞎颗。” “怎么了捌议?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵哼拔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我禁灼,道長(zhǎng)管挟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任弄捕,我火速辦了婚禮僻孝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘守谓。我一直安慰自己穿铆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布斋荞。 她就那樣靜靜地躺著荞雏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凤优,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天悦陋,我揣著相機(jī)與錄音,去河邊找鬼筑辨。 笑死俺驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棍辕。 我是一名探鬼主播暮现,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楚昭!你這毒婦竟也來了栖袋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抚太,失蹤者是張志新(化名)和其女友劉穎塘幅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凭舶,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌块,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帅霜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呼伸,死狀恐怖身冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情括享,我是刑警寧澤搂根,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站铃辖,受9級(jí)特大地震影響剩愧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娇斩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一仁卷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬第,春花似錦锦积、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春哮幢,著一層夾襖步出監(jiān)牢的瞬間带膀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工橙垢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垛叨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓钢悲,卻偏偏與公主長(zhǎng)得像点额,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莺琳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353