iOS11 適配tableView的組頭headerView預(yù)估行高自動(dòng)行高

升級(jí)到 iOS 11 之后混滔,tableView變化很大据途,此篇主要說明 section 的 headerView 根據(jù)設(shè)置的約束自動(dòng)適配行高的問題欣孤。

內(nèi)容提要

  1. 升級(jí)到 iOS 11 之后嫉沽,使用 tableView 封裝的仿QQ好友二級(jí)列表控件點(diǎn)擊組頭視圖 headerView 時(shí)會(huì)報(bào)很多約束錯(cuò)誤择诈,并且 contentView 的高度為0 械蹋!
  2. 預(yù)估行高 estimatedHeaderHeight 的問題。

原來是使用 masonry 自動(dòng)布局羞芍,跟 cell 的自動(dòng)行高一樣哗戈,系統(tǒng)自動(dòng)適配組頭 view 的行高。

問題描述

問題一:
實(shí)際問題是這樣的涩金,section 的 headerFooterView 中有上下排列的兩個(gè)Label谱醇,暫且這樣叫法:上面的 Label 是 lblName; 下面的 Label 是 lblAddr 暇仲,由于地址 addr 的字?jǐn)?shù)不確定,所以可能需要多行顯示副渴,相應(yīng)地 headerView 的高度也要自動(dòng)跟隨變化奈附。

之前是使用類似 cell 自動(dòng)行高那種傳統(tǒng)的設(shè)置方式,
tableView.estimatedSectionHeaderHeight = 50;
tableViwe.rowHeight = UITableViewAutomaticDimension;
然后垂直方向約束設(shè)置 --
lblName 的約束 【make.top.equalTo(self.contentView).mas_offset(5);】
lblAddr 的約束 【make.bottom.equalTo(self.contentView).mas_offset(-5);】

但是發(fā)現(xiàn)點(diǎn)擊顯示子列表cell的時(shí)候會(huì)有 headerView 的約束錯(cuò)誤煮剧,錯(cuò)誤的意思就是說contentView的高度為 0 并且重復(fù)設(shè)置了高度之類(具體錯(cuò)誤內(nèi)容不在此描述斥滤,此處只討自動(dòng)行高論解決方案~)

經(jīng)過試驗(yàn),如果設(shè)置 lblName.top 距離 contentView.top 為 0勉盅,lblAddr.bottom 距離 contentView.bottom 的距離為 0佑颇,是沒有問題的,不管怎么點(diǎn)擊時(shí)不報(bào)約束錯(cuò)誤的草娜。

于是有了這樣一種解決方案挑胸,那就是,如果想讓 lblName.top 距離 contentView.top 是 x宰闰,就在此填充一個(gè)高度為 x 的 view茬贵;
同理,lblAddr.bottom 到 contentView.bottom 之間也填充一個(gè)高度為 y 的小 view移袍。
這樣自上而下全部填充滿 contentView 而不是留空解藻,就不會(huì)出現(xiàn)之前的約束錯(cuò)誤!

同樣地葡盗,水平方向也是如此設(shè)置螟左,使用寬度固定的小view填充。
當(dāng)然觅够,如果 contentView 內(nèi)部的控件距離 contentView 的邊緣為0的話胶背,就不必使用小view填充了,直接設(shè)置邊緣距離為0就可以了喘先。

目前只發(fā)現(xiàn)這種方法奄妨,可能比較笨拙。希望找到更好的辦法苹祟,還望路過的大神不吝賜教,同時(shí)希望朋友們相互討論共同進(jìn)步评雌。

問題二:
如上使用小view填充的方式設(shè)置好了树枫,那么是不是就一切 OK 了呢?

當(dāng)然不是景东,這里面還發(fā)現(xiàn)一個(gè)坑砂轻。

我們知道 iOS 11 之后,tableView 默認(rèn)使用了 Self-Sizing estimatedSectionHeaderHeight = 44斤吐。這個(gè)屬性是預(yù)估 header 行高搔涝,也可以通過相同名稱的代理來返回預(yù)估 header 行高厨喂。tableView 會(huì)現(xiàn)根據(jù)預(yù)估行高計(jì)算出總高度,然后再慢慢計(jì)算實(shí)際高度庄呈。這些點(diǎn)詳細(xì)資料很多蜕煌,大家自己谷歌就可以,此處不再贅述诬留。

在 iOS 11 之前斜纪,我們給個(gè)預(yù)估行高(不管是 sectionHeader 還是 cell 的預(yù)估行高)并設(shè)置 headerView.rowHeight = UITableViewAutomaticDimension;然后在內(nèi)部 contentView 中設(shè)置好連貫的約束文兑,就可以實(shí)現(xiàn)自動(dòng)適配行高盒刚。注意:不管這個(gè)預(yù)估行高是大于真實(shí)的行高還是小于真實(shí)的行高,都沒有問題绿贞。

但是同樣的項(xiàng)目在 iOS 11 之后發(fā)現(xiàn)因块,當(dāng)內(nèi)容很多需要增加高度顯示的時(shí)候就會(huì)報(bào)約束錯(cuò)誤!經(jīng)過對(duì)比發(fā)現(xiàn)籍铁,當(dāng)真實(shí)行高大于預(yù)估行高時(shí)就會(huì)報(bào)約束錯(cuò)誤涡上,反之則沒有問題!

所以是這樣解決的寨辩,在返回真實(shí)行高的代理方法中
【 return UITableViewAutomaticDimension; 】吓懈,
在返回預(yù)估行高中,盡量返回一個(gè)比“預(yù)期”的行高大一點(diǎn)的值靡狞,這樣就沒問題了耻警。

解決方案

問題一,使用小 view 填充 margin甸怕。
問題二甘穿,返回的預(yù)估行高盡量大,比“預(yù)期”的行高大一點(diǎn)梢杭。

由此温兼,上面兩個(gè)問題都得到解決。

這是目前項(xiàng)目中遇到的坑武契,寫出來與大家分享討論募判,希望能有更好的解決方案。

附:
升級(jí)到 iOS 11 之后咒唆,tableView上方會(huì)留有一行空白届垫,通過設(shè)置contentOffset和tableView.headerView = [[UIView alloc] init]; 的方式設(shè)置都去不掉。后來設(shè)置headerView的高度為0.1全释,就可以解決装处。
self.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 0.1)];
self.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 0.1)];

------------------ 分割線 ------------------

2017-12-28
補(bǔ)充:

對(duì)于前面所說的“margin 需要使用小 view 代替填充”的問題,在最近設(shè)置自動(dòng)cell的行高時(shí)浸船,又有了新的變化妄迁。
現(xiàn)在不必使用小view 填充了寝蹈,還是使用
【make.top.equalTo(self.view).mas_offset(8); 】
這樣子來設(shè)置就ok了,真是奇怪登淘!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末箫老,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子形帮,更是在濱河造成了極大的恐慌槽惫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩撑,死亡現(xiàn)場(chǎng)離奇詭異界斜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)合冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門各薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人君躺,你說我怎么就攤上這事峭判。” “怎么了棕叫?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵林螃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我俺泣,道長(zhǎng)疗认,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任伏钠,我火速辦了婚禮横漏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熟掂。我一直安慰自己缎浇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布赴肚。 她就那樣靜靜地躺著素跺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誉券。 梳的紋絲不亂的頭發(fā)上亡笑,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音横朋,去河邊找鬼。 笑死百拓,一個(gè)胖子當(dāng)著我的面吹牛琴锭,可吹牛的內(nèi)容都是我干的晰甚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼决帖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厕九!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起地回,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扁远,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刻像,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅买,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年细睡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谷羞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溜徙,死狀恐怖湃缎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蠢壹,我是刑警寧澤嗓违,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站图贸,受9級(jí)特大地震影響蹂季,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜求妹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一乏盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧制恍,春花似錦父能、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹃唯,卻和暖如春爱榕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坡慌。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工黔酥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓跪者,卻偏偏與公主長(zhǎng)得像棵帽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渣玲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 翻譯自“Auto Layout Guide”逗概。 2 自動(dòng)布局細(xì)則手冊(cè) 2.1 堆棧視圖 接下來的章節(jié)展示了如何使用...
    lakerszhy閱讀 1,866評(píng)論 3 9
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,662評(píng)論 1 9
  • 適配iOS11 ??蘋果官方文檔??蘋果官方視頻為了掙錢...哦??不是,為了廣大中國的開發(fā)者,蘋果官方文檔出了好多中文...
    philiha閱讀 1,165評(píng)論 1 50
  • 很久沒有上課了, 感覺有點(diǎn)小累. 有這種感覺的不僅僅只有我, 還有上課的老師. 畢竟是把一個(gè)學(xué)期的課壓縮成了一周....
    斐波那契的數(shù)字閱讀 293評(píng)論 0 0
  • 自我主宰說白了就是自我克制,自我控制忘衍,是自控力逾苫,自我控制是最強(qiáng)者的本能。 我特別贊同一個(gè)觀點(diǎn)枚钓,人最大的敵人是自己铅搓。...
    花少顏閱讀 2,394評(píng)論 0 0