iOS自動布局

Storyboard中用Auto Layout的“Bug”

在storyboard中使用自動布局,根控制器為一個UITableView邑彪,所有的cell的行高根據(jù)cell內(nèi)容的多少動態(tài)變化(類似微博惋戏、微信朋友圈等應(yīng)用)沟蔑。

鏈接地址:demo

據(jù)此居触,我根據(jù)Cell的內(nèi)容獲取Cell內(nèi)的labelUIImageView的frame馅而,然后在layoutSubview方法中根據(jù)frame來計算最終的行高,然后黍聂,在controller中通過代理方法拿到行高。
這是很常規(guī)的一個開發(fā)思路身腻,可是在storyboard開發(fā)中使用prototype(原型)cell的方式來實現(xiàn)卻遇到了問題...

1.首先产还,我在StoryBoard里面使用prototype(原型)cell,而且沒有改ViewController屬性檢測器中的simulation Metricssize

<img src="http://upload-images.jianshu.io/upload_images/2473291-318b2b21411c5051.png" width="400" height="400" alt="不設(shè)置此處的尺寸"/>

2.然后嘀趟,我給cell中的所有的子控件設(shè)置了約束脐区,并且確認(rèn)無誤,沒有警告和錯誤她按,然后我update了一下所有控件的frame(注意:這里如果不更新所有控件的frame的話牛隅,storyboard便會給你報黃色警告炕柔,提示你期望的大小和真實的大小不相同,截圖如下

<img src="http://upload-images.jianshu.io/upload_images/2473291-2a660988870a8925.png" width="400" height="300" alt="ExpectedFrame和ActualFrame的警告"/>

3.解決上面的辦法也很簡單媒佣,點擊警報匕累,點擊Fix(修復(fù))或者選中所有的控件,點擊下方設(shè)置約束按鈕中最右邊的一個默伍,選擇"Update Frame"就可以了

<img src="http://upload-images.jianshu.io/upload_images/2473291-3292bacfb3423660.png" width="400" height="400" alt="修復(fù)上述警報的沖突"/>

4.設(shè)置完約束欢嘿,我需要分別實現(xiàn)模型中的邏輯,和自定義的cell中的邏輯

4.1. 模型類從網(wǎng)絡(luò)獲取數(shù)據(jù)右锨,使用的是異步子線程蛋勺,下載完成后回調(diào)颓遏,切換主線程給ViewController中的數(shù)據(jù)數(shù)組賦值。

4.2. 給自定的cell內(nèi)的子控件賦值寫在了UITableViewDatasource的返回cell的方法中掐隐,但是,要求cell內(nèi)的副標(biāo)題Label的顯示或不顯示钞馁,取決于主標(biāo)題Label的行數(shù)虑省,如果主標(biāo)題只顯示1行,那么就顯示副標(biāo)題指攒,相反慷妙,就不顯示副標(biāo)題。

這個邏輯才是重點
我在cell的layoutSubviews方法中獲取主標(biāo)題的frame允悦,可是膝擂,無論如何改變主標(biāo)題Label的約束,通過layoutSubviews方法獲取到的frame始終不變隙弛。這里引起了我的懷疑架馋,因為layoutSubviews方法的解釋是當(dāng)父控件的frame發(fā)生改變的時候,會調(diào)用此方法全闷。但是實際來看在layoutSubviews方法中cell內(nèi)的控件的frame仍然未發(fā)生變化叉寂,還是storyboard中Update Frames之后的值!!

但是當(dāng)執(zhí)行完layoutSubviews方法后,界面就已經(jīng)能夠正常地顯示出來了总珠,并且大小都正常屏鳍,但是在layoutSubviews方法里打印的Label的frame卻不正確,這就很奇怪局服!

副標(biāo)題不正常的情況

于是钓瞭,我繼續(xù)猜想,這可能是由于約束設(shè)置完成之后淫奔,需要通過很多計算山涡,而產(chǎn)生一個時間差,所以就使得在layoutSubviews方法執(zhí)行的那一瞬間,無法立即計算出主標(biāo)題的正確的frame鸭丛。

接著竞穷,我尋找其他的思路,發(fā)現(xiàn)有一個方法layoutIfNeeded鳞溉,這個方法的解釋是:Lays out the subviews immediately.在調(diào)用這個方法后瘾带,立即布局該控件的子控件,因此穿挨,我試著在調(diào)用主標(biāo)題Label的getter方法之前月弛,調(diào)用layoutIfNeeded這個方法,結(jié)果就成功了科盛。

正常的label顯示情況.jpg

得出總結(jié):當(dāng)父控件的frame發(fā)生變化的時候,會調(diào)用它的layoutSubviews方法帽衙,但是,此時我們的約束還沒有計算好所有子控件的frame值贞绵,所以厉萝,要在layoutSubviews方法內(nèi)獲取子控件的frame,可能就會拿到一個錯誤的frame值

在解決這個Bug的同時榨崩,還遇到一個小插曲谴垫,當(dāng)屬性檢測器使用的是默認(rèn)的大小的時候,如果勾選了storyboard中的ViewController屬性檢測器的Refreshing中的Enabled選項母蛛,則會出現(xiàn)在剛開始進(jìn)入應(yīng)用的時候翩剪,就會加載self.refreshControl 的title 內(nèi)容

使用storyboard默認(rèn)的大小

但是當(dāng)我不進(jìn)行其他任何的操作,而僅僅只是把屬性檢測器中模擬器的size屬性設(shè)置為一個其他的大小時彩郊,就不會有上述的效果了

設(shè)置一個指定的尺寸之后.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末前弯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秫逝,更是在濱河造成了極大的恐慌恕出,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违帆,死亡現(xiàn)場離奇詭異浙巫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刷后,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門的畴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尝胆,你說我怎么就攤上這事丧裁。” “怎么了班巩?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵渣慕,是天一觀的道長。 經(jīng)常有香客問我抱慌,道長逊桦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任抑进,我火速辦了婚禮强经,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寺渗。我一直安慰自己匿情,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布信殊。 她就那樣靜靜地躺著炬称,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涡拘。 梳的紋絲不亂的頭發(fā)上玲躯,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音鳄乏,去河邊找鬼跷车。 笑死,一個胖子當(dāng)著我的面吹牛橱野,可吹牛的內(nèi)容都是我干的朽缴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼水援,長吁一口氣:“原來是場噩夢啊……” “哼密强!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裹唆,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤誓斥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后许帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劳坑,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年成畦,在試婚紗的時候發(fā)現(xiàn)自己被綠了距芬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡循帐,死狀恐怖框仔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拄养,我是刑警寧澤离斩,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布银舱,位于F島的核電站,受9級特大地震影響跛梗,放射性物質(zhì)發(fā)生泄漏寻馏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一核偿、第九天 我趴在偏房一處隱蔽的房頂上張望诚欠。 院中可真熱鬧,春花似錦漾岳、人聲如沸轰绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽左腔。三九已至,卻和暖如春捅儒,著一層夾襖步出監(jiān)牢的瞬間翔悠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工野芒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蓄愁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓狞悲,卻偏偏與公主長得像撮抓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摇锋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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