如果你經(jīng)常使用IB布局,在XIB
里使用tableView
的時候,一定遇到過一個問題,怎么直接通過XIB
來設(shè)置tableView
的tableHeaderView
。今天,就來說下這個問題。
在介紹方法之前,需要講解下一個屬性。
autoResizingMask
官方定義
An integer bit mask that determines how the receiver resizes itself when its superview’s bounds change.
解釋
枚舉類型,當父視圖bounds改變時,自動調(diào)節(jié)子控件在父視圖中的位置與寬高
枚舉類型
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0, //不自動調(diào)整。
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,//自動調(diào)整view與父視圖左邊距,以保證右邊距不變
UIViewAutoresizingFlexibleWidth = 1 << 1,//自動調(diào)整view的寬度,保證左邊距和右邊距不變
UIViewAutoresizingFlexibleRightMargin = 1 << 2,//自動調(diào)整view與父視圖右邊距,以保證左邊距不變
UIViewAutoresizingFlexibleTopMargin = 1 << 3,//自動調(diào)整view與父視圖上邊距,以保證下邊距不變
UIViewAutoresizingFlexibleHeight = 1 << 4,//自動調(diào)整view的高度,以保證上邊距和下邊距不變
UIViewAutoresizingFlexibleBottomMargin = 1 << 5 //自動調(diào)整view與父視圖下邊距,以保證上邊距不變
};
看了上面的介紹,對于AutoResizingMask
的功能應該有一個大致的了解了。下面再回到tableHeaderView
上面來。我們來了解下為什么使用XIB
設(shè)置tableHeaderView
不生效呢?
TableHeaderView
新建工程,在
ViewController
中添加一個TableView
。新建個類
FDTableHeaderView
,設(shè)置背景色為淺灰色。并添加一個Label
控件作為我們改變之后動態(tài)改變TableHeaderView
的工具。
- 在
Controller
中通過XIB
聲明一個FDTableHeaderView
對象,設(shè)置為tableView
的tableHeaderView
。
UINib *nib = [UINib nibWithNibName:@"FDTableHeaderView" bundle:nil];
FDTableHeaderView *header = [nib instantiateWithOwner:nil options:nil][0];
self.tableView.tableHeaderView = header;
運行看結(jié)果:
從上圖可以看到,Header
并沒有生效,這是為什么呢?我們設(shè)置個斷點來看下。
上面這張圖是設(shè)置斷點后的圖片,并打印了header
的一些信息。仔細觀察,可以發(fā)現(xiàn)一個autoresize
屬性為(W+H),結(jié)合上面我們介紹的AutoResizngMask
可以分析出來,header
的AutoResizingMask
應該是被默認設(shè)置成了根據(jù)父視圖的大小改變自身的寬高,可能是這個造成header
的frame
被改變了。
在這里我們可以簡單假設(shè)下,如果把header
的AutoResizingMask
設(shè)置為None
,不讓header
隨著父視圖的改變而改變,會有什么效果?
header.autoresizingMask = UIViewAutoresizingNone;
從上圖可以看到,設(shè)置header
的AutoResizingMask
為UIViewAutoresizingNone
后,header就不會跟隨父視圖變化了。
這樣,我們通過XIB
來設(shè)置tableHeaderView
的目的就達到了,只需要添加一行代碼而已。
總結(jié)
通過上面的一個簡單嘗試,我們達到了直接使用XIB
來設(shè)置tableHeaderView
或者tableFooterView
的功能,這樣在實際開發(fā)中就可以更快速的設(shè)置了。然而這里,仍然有一個疑惑,從結(jié)果分析來看,header
無法生效的原因可能是父視圖frame
為0造成的,然后通過控制臺打印可以看到header
的父視圖是tableView
,并且frame
不為0,那導致header
的frame
被改變的根本原因出在哪里呢?tableView
在底層又到底是怎么添加header
的呢?有知道的可以幫忙科普下,謝謝~
感謝
文章作為學習階段的總結(jié),會存在許多不足之處,如有講解錯誤之處,希望可以及時指出,及時更正。如果這篇文章給予你了一點幫助,那就順手在簡書點個關(guān)注,在GitHub上點個Star,謝謝~
共勉。
autoresizingMask - UIView | Apple Developer Documentation
IOS自動布局之Autoresizing