iOS開發(fā)自定義View布局子控件

iOS開發(fā)中诺凡,- (void)layoutSubviews{}方法及相關方法注意點K当础议惰!


文章著重介紹iOS開發(fā)中如果給subViews設置fram

layout相關的方法

- (void)layoutSubviews {};
- (void)layoutIfNeeded {};
- (void)setNeedsLayout {};
- (CGSize)sizeThatFits:(CGSize)size {};
- (void)sizeToFit {};
- (void)setNeedsDisplay {};
- (void)drawRect {};

一、-(void)layoutSubviews{}在以下情況下會被調(diào)用/被觸發(fā)乡恕?言询?

  • 1俯萎、[self setNeedsLayout]
  • 2、addSubview會觸發(fā)layoutSubviews
  • 3运杭、設置view的Frame會觸發(fā)layoutSubviews夫啊,當然前提是frame的值設置前后發(fā)生了變化
  • 4、滾動一個UIScrollView會觸發(fā)layoutSubviews
  • 5辆憔、旋轉Screen會觸發(fā)父UIView上的layoutSubviews事件

(在蘋果的官方文檔中強調(diào):
You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 當我們在某個類的內(nèi)部調(diào)整子視圖位置時撇眯,需要調(diào)用。反過來的意思就是說:如果你想要在外部設置subviews的位置躁愿,就不要重寫叛本。)

1.1.什么時候,需要重寫- (void)layoutSubviews{}呢彤钟?来候?
  • view是系統(tǒng)的,不需要重寫逸雹,如果view是自定義的营搅,需要重寫。
  • -layoutSubviews方法:這個方法里面梆砸,默認沒有做任何事情转质,需要子類進行重寫,自定義view時帖世,手動重寫休蟹,這里面只能寫subview的frame限制。
1.2. 如何手動觸發(fā)這個方法(- (void)layoutSubviews{})日矫?

iOS開發(fā)中赂弓,開發(fā)者不能直接調(diào)用這個方法,系統(tǒng)默認不允許我們這樣哪轿,那怎么在需要的時候盈魁,手動觸發(fā)這個方法呢?下面提供兩個方法窃诉。杨耙。

  • -(void)setNeedsLayout {};//作用:告之view,需要重新布局飘痛,在未來某個時間點系統(tǒng)異步觸發(fā)布局方法,且標記view.subViews需要重新布局珊膜。這個方法使用后,view不會立即刷新敦冬,但layoutSubviews{}一定會被調(diào)用.
  • -(void)layoutIfNeeded {};//如果:有需要刷新的標記辅搬,立即調(diào)用layoutSubviews進行布局(如果沒有標記,不會調(diào)用layoutSubviews)
  • 開發(fā)中示例:
    • 1.需要立即刷新view的frame
       [self layoutIfNeeded];//更改最新的標記
      
    • 2.在初始化方法init這類方法里、或view第一次顯示之前堪遂,系統(tǒng)默認標記“需要刷新”介蛉,故此:這些地方我們可直接調(diào)用-(void)layoutIfNeeded{} eg:[view layoutIfNeeded]
    • 3.需要多次修改布局,修改完每處布局后溶褪,還需要下次修改來完善布局币旧,那這次布局就需要做一下標記
      //假設需要4出更改布局
       - (void)change_01~03//1-3處更改,用setNeedsLayout標記
       {  
           [self setNeedsLayout];//更改最新的標記
       }
       - (void)change_04//等到所有布局晚上后
       {  
           [self layoutIfNeeded];//更改最新的標記
       }
      

二猿妈、重繪制相關方法

開發(fā)者:重新繪制一個嶄新的view吹菱,需要重寫-(void)drawRect:(CGRect)rect {}

1.1.什么時候,需要重寫-(void)drawRect:(CGRect)rect {}呢彭则?鳍刷?
  • 取決開發(fā)者的個人愛好。
1.2. 如何手動觸發(fā)這個方法(- (void) drawRect:(CGRect)rect{})俯抖?

iOS開發(fā)中输瓜,開發(fā)者不能直接調(diào)用這個方法,系統(tǒng)默認不允許我們這樣芬萍,那怎么在需要的時候尤揣,手動觸發(fā)這個方法呢?下面提供兩個方法柬祠。北戏。

  • -(void) setNeedsDisplay {};//作用:標記為需要重繪,異步調(diào)用drawRect.
  • -(void) setNeedsDisplayInRect:(CGRect)invalidRect {};//標記為需要局部重繪.

三漫蛔、其他與布局subViews.frame相關方法

- (CGSize)sizeThatFits:(CGSize)size {};
- (void)sizeToFit {};

注意點:1.無論什么時候調(diào)用sizeToFit嗜愈,其底層實質sizeToFit自動調(diào)用sizeThatFits方法。2. -(void)sizeToFit {}不應該在子類中被重寫莽龟,應該重寫 -(CGSize)sizeThatFits:(CGSize)size {}芝硬,

  • -(CGSize)sizeThatFits:(CGSize)size {}//返回值為開發(fā)者給定的size,參數(shù)size:是現(xiàn)在view現(xiàn)有的size轧房。//開發(fā)者可自定義控件實質返回的大小。
3.1.sizeToFit的用途绍绘?
  • 在開發(fā)中奶镶,經(jīng)常用到UIButton,UIBarButtonItem,UITableView的組頭,組尾,表頭,表尾.類似控件。他們無需我們設置frame陪拘,只需要制定size厂镇。這個時候,我們可以通過直接調(diào)用sizeToFit是這類控件根據(jù)自身的內(nèi)容左刽,獲取自身的大小捺信,顯示出來。
3.2. sizeThatFits的用途?
  • 在實際開發(fā)中這個方法一般沒有什么用途迄靠,因為它不需要我們手動調(diào)用秒咨。其次:我們都很相信蘋果,會給我們返回合理的size掌挚。
  • 除非:自定義view雨席,重寫它,限制自身view的大小吠式。方便外層調(diào)用sizeToFit時陡厘,view顯示的大小是固定的(you給定的size)
3.3.注意:
  • sizeToFit和sizeThatFits方法都沒有遞歸,對subviews也不負責特占,只負責自己

補充:

  • drawRect是對receiver的重繪糙置,能獲得context
  • layoutSubviews對subviews重新布局
  • layoutSubviews方法調(diào)用先于drawRect

  • setNeedsLayout在receiver標上一個需要被重新布局的標記,在系統(tǒng)runloop的下一個周期自動調(diào)用layoutSubviews(iphone device的刷新頻率是60hz是目,也就是(1/60)秒后重繪)
  • layoutIfNeeded方法如其名谤饭,UIKit會判斷該receiver是否需要layout.如需要,無需等runloop的下一個周期胖笛,而是立即馬上更新
  • layoutIfNeeded遍歷的不是superview鏈网持,應該是subviews鏈

后期會更新自動布局相關方法-(void)updateConstraints

- (void)updateConstraints{}
- (BOOL)needsUpdateConstraints{}
- (void)setNeedsUpdateConstraints{}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市长踊,隨后出現(xiàn)的幾起案子功舀,更是在濱河造成了極大的恐慌,老刑警劉巖身弊,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辟汰,死亡現(xiàn)場離奇詭異,居然都是意外死亡阱佛,警方通過查閱死者的電腦和手機帖汞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凑术,“玉大人翩蘸,你說我怎么就攤上這事』囱罚” “怎么了催首?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泄鹏。 經(jīng)常有香客問我郎任,道長,這世上最難降的妖魔是什么备籽? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任舶治,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘霉猛。我一直安慰自己尺锚,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布韩脏。 她就那樣靜靜地躺著缩麸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赡矢。 梳的紋絲不亂的頭發(fā)上杭朱,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音吹散,去河邊找鬼弧械。 笑死,一個胖子當著我的面吹牛空民,可吹牛的內(nèi)容都是我干的刃唐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼界轩,長吁一口氣:“原來是場噩夢啊……” “哼画饥!你這毒婦竟也來了?” 一聲冷哼從身側響起浊猾,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抖甘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葫慎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衔彻,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年偷办,在試婚紗的時候發(fā)現(xiàn)自己被綠了艰额。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡椒涯,死狀恐怖柄沮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情废岂,我是刑警寧澤铡溪,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泪喊,受9級特大地震影響,放射性物質發(fā)生泄漏髓涯。R本人自食惡果不足惜袒啼,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚓再,春花似錦滑肉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至六荒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矾端,已是汗流浹背掏击。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秩铆,地道東北人砚亭。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像殴玛,于是被迫代替她去往敵國和親捅膘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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