如果你經(jīng)常使用IB布局杀捻,在XIB
里使用tableView
的時(shí)候闺骚,一定遇到過(guò)一個(gè)問(wèn)題,怎么直接通過(guò)XIB
來(lái)設(shè)置tableView
的tableHeaderView
称诗。今天,就來(lái)說(shuō)下這個(gè)問(wèn)題头遭。
在介紹方法之前寓免,需要講解下一個(gè)屬性癣诱。
autoResizingMask
官方定義
An integer bit mask that determines how the receiver resizes itself when its superview’s bounds change.
解釋
枚舉類型,當(dāng)父視圖bounds改變時(shí)袜香,自動(dòng)調(diào)節(jié)子控件在父視圖中的位置與寬高
枚舉類型
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0, //不自動(dòng)調(diào)整撕予。
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,//自動(dòng)調(diào)整view與父視圖左邊距,以保證右邊距不變
UIViewAutoresizingFlexibleWidth = 1 << 1,//自動(dòng)調(diào)整view的寬度蜈首,保證左邊距和右邊距不變
UIViewAutoresizingFlexibleRightMargin = 1 << 2,//自動(dòng)調(diào)整view與父視圖右邊距实抡,以保證左邊距不變
UIViewAutoresizingFlexibleTopMargin = 1 << 3,//自動(dòng)調(diào)整view與父視圖上邊距,以保證下邊距不變
UIViewAutoresizingFlexibleHeight = 1 << 4,//自動(dòng)調(diào)整view的高度欢策,以保證上邊距和下邊距不變
UIViewAutoresizingFlexibleBottomMargin = 1 << 5 //自動(dòng)調(diào)整view與父視圖下邊距吆寨,以保證上邊距不變
};
看了上面的介紹,對(duì)于AutoResizingMask
的功能應(yīng)該有一個(gè)大致的了解了猬腰。下面再回到tableHeaderView
上面來(lái)鸟废。我們來(lái)了解下為什么使用XIB
設(shè)置tableHeaderView
不生效呢?
TableHeaderView
新建工程姑荷,在
ViewController
中添加一個(gè)TableView
盒延。新建個(gè)類
FDTableHeaderView
,設(shè)置背景色為淺灰色鼠冕。并添加一個(gè)Label
控件作為我們改變之后動(dòng)態(tài)改變TableHeaderView
的工具添寺。
- 在
Controller
中通過(guò)XIB
聲明一個(gè)FDTableHeaderView
對(duì)象,設(shè)置為tableView
的tableHeaderView
懈费。
UINib *nib = [UINib nibWithNibName:@"FDTableHeaderView" bundle:nil];
FDTableHeaderView *header = [nib instantiateWithOwner:nil options:nil][0];
self.tableView.tableHeaderView = header;
運(yùn)行看結(jié)果:
從上圖可以看到计露,Header
并沒(méi)有生效,這是為什么呢憎乙?我們?cè)O(shè)置個(gè)斷點(diǎn)來(lái)看下票罐。
上面這張圖是設(shè)置斷點(diǎn)后的圖片,并打印了header
的一些信息泞边。仔細(xì)觀察该押,可以發(fā)現(xiàn)一個(gè)autoresize
屬性為(W+H),結(jié)合上面我們介紹的AutoResizngMask
可以分析出來(lái)阵谚,header
的AutoResizingMask
應(yīng)該是被默認(rèn)設(shè)置成了根據(jù)父視圖的大小改變自身的寬高蚕礼,可能是這個(gè)造成header
的frame
被改變了。
在這里我們可以簡(jiǎn)單假設(shè)下梢什,如果把header
的AutoResizingMask
設(shè)置為None
奠蹬,不讓header
隨著父視圖的改變而改變,會(huì)有什么效果嗡午?
header.autoresizingMask = UIViewAutoresizingNone;
從上圖可以看到囤躁,設(shè)置header
的AutoResizingMask
為UIViewAutoresizingNone
后,header就不會(huì)跟隨父視圖變化了。
這樣割以,我們通過(guò)XIB
來(lái)設(shè)置tableHeaderView
的目的就達(dá)到了金度,只需要添加一行代碼而已。
總結(jié)
通過(guò)上面的一個(gè)簡(jiǎn)單嘗試严沥,我們達(dá)到了直接使用XIB
來(lái)設(shè)置tableHeaderView
或者tableFooterView
的功能猜极,這樣在實(shí)際開(kāi)發(fā)中就可以更快速的設(shè)置了。然而這里消玄,仍然有一個(gè)疑惑跟伏,從結(jié)果分析來(lái)看,header
無(wú)法生效的原因可能是父視圖frame
為0造成的翩瓜,然后通過(guò)控制臺(tái)打印可以看到header
的父視圖是tableView
受扳,并且frame
不為0,那導(dǎo)致header
的frame
被改變的根本原因出在哪里呢兔跌?tableView
在底層又到底是怎么添加header
的呢勘高?有知道的可以幫忙科普下,謝謝~
感謝
文章作為學(xué)習(xí)階段的總結(jié)坟桅,會(huì)存在許多不足之處华望,如有講解錯(cuò)誤之處,希望可以及時(shí)指出仅乓,及時(shí)更正赖舟。如果這篇文章給予你了一點(diǎn)幫助,那就順手在簡(jiǎn)書點(diǎn)個(gè)關(guān)注夸楣,在GitHub上點(diǎn)個(gè)Star宾抓,謝謝~
共勉。
autoresizingMask - UIView | Apple Developer Documentation
IOS自動(dòng)布局之Autoresizing