Autoresizing小坑一枚

因為使用簡單,autoresizing的自動布局方式一直挺受我偏愛的舀患。然而前端時間測試的時候徽级,出現(xiàn)了幾個布局上的bug,調(diào)試后發(fā)現(xiàn)原來是沒有用正確姿勢使用autoresizing所致的(╥﹏╥)聊浅。

為了描述一下這個bug餐抢,假裝我寫了這樣一段代碼:

CGRect parentFrame = CGRectMake(0, 0, 100, 100);
UIView *parent = [[UIView alloc] initWithFrame:parentFrame];
parent.backgroundColor = [UIColor redColor];
[self.view addSubview:parent];

UIView *son = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 100, 50)];
son.backgroundColor = [UIColor blueColor];
son.autoresizingMask = UIViewAutoresizingFlexibleHeight;
[parent addSubview:son];

[parent setFrame:CGRectMake(0, 0, 100, 0)];
[parent setFrame:parentFrame];

大意是,希望son這個視圖的底部永遠和parent視圖的底部對齊低匙,而son視圖的頂部永遠和parent視圖的頂部有50單位的距離旷痕。也就是這樣的結(jié)果:

我期待的結(jié)果(●°u°●)? 」

但是運行完這段代碼后我得到的結(jié)果是這樣的:


我得到的結(jié)果∑(?Д?)

于是bug就產(chǎn)生了(╥﹏╥)

為什么會這樣呢?明明正確設(shè)置了autoresizing參數(shù)顽冶,可最后得到了錯誤的布局結(jié)果欺抗。仔細一想,原來是因為其中經(jīng)歷了

[parent setFrame:CGRectZero];

這個步驟强重。

在我的理解中佩迟,如果僅有UIViewAutoresizingFlexibleHeight,則表示竿屹,無論parent視圖的尺寸如何變化报强,son視圖的上邊界和parent視圖的上邊界的距離不變,son視圖的下邊界和parent視圖的下邊界的距離不變拱燃,寫成公式可能就是:

CGRectGetMinY(parent.bounds) - CGRectGetMinY(son.frame) 不變
CGRectGetMaxY(parent.bounds) - CGRectGetMaxY(son.frame) 不變

最開始秉溉,parent視圖的bounds(0, 0, 100, 100),而son視圖的frame(0, 50, 100, 50),也就是說:

CGRectGetMinY(parent.bounds) - CGRectGetMinY(son.frame) = -50
CGRectGetMaxY(parent.bounds) - CGRectGetMaxY(son.frame) = 0

后來召嘶,parent視圖的bounds變?yōu)?code>(0, 0, 0, 0)父晶,此時若輸出son視圖的frame,會發(fā)現(xiàn)frame = (0 50; 0 0)弄跌。也就是說這個時候

CGRectGetMinY(parent.bounds) - CGRectGetMinY(son.frame) = -50
CGRectGetMaxY(parent.bounds) - CGRectGetMaxY(son.frame) = -50

這個結(jié)果和我所理解的UIViewAutoresizingFlexibleHeight矛盾了甲喝。

矛盾就出在,如果要嚴(yán)格按照“不變”的規(guī)則行事的話铛只,此時son.frame.size.height應(yīng)該為-50才對埠胖。
但是尺寸怎么可以是負值呢,可能autoresizing出于這個考慮淳玩,將-50的高度處理成了0直撤。這也就說明,在程序執(zhí)行到這一步的時候蜕着,失去了-50這個信息谋竖。

最后,當(dāng)parent視圖的bounds回到(0, 0, 100, 100)的時候承匣,autoresizing保持了

CGRectGetMinY(parent.bounds) - CGRectGetMinY(son.frame) = -50
CGRectGetMaxY(parent.bounds) - CGRectGetMaxY(son.frame) = -50

這個關(guān)系不變蓖乘,導(dǎo)致了son視圖的高度最終變成了100∪推看一眼代碼最終執(zhí)行的結(jié)果嘉抒,果然是這樣。

所以宽闲,我的bug就出在众眨,同事因為他的業(yè)務(wù)需要,改變了我負責(zé)的最外層視圖的frame容诬,而后又將其改回原值(他以為什么也不會發(fā)生娩梨,我開始也這么以為……),這個過程中览徒,我負責(zé)的子視圖在autoresize時出現(xiàn)了剛才的問題狈定,導(dǎo)致最后呈現(xiàn)出了錯誤的布局。


在解決這個問題的時候习蓬,我還想到了纽什,如果autoresizing不將負值的寬高轉(zhuǎn)換成0,會怎樣呢躲叼?
試了試芦缰,發(fā)現(xiàn)UIView會自動將負值的寬高轉(zhuǎn)換成正值。

比如執(zhí)行完這幾行代碼后

UIView *view = [[UIView alloc] init];
CGRect rect = CGRectMake(100, 100, -50, -50);
view.frame = rect;

打印view視圖枫慷,會發(fā)現(xiàn)

<UIView: 0x7ff88bd4db00; frame = (50 50; 50 50); layer = <CALayer: 0x7ff88bd4d330>>

view視圖的frame被轉(zhuǎn)換了让蕾。

所以不管怎么樣浪规,使用autoresizing時,如果不小心讓某個視圖的寬高變成了負值探孝,則一定會損失一部分信息笋婿,導(dǎo)致最后即便父視圖的frame回到原值,子視圖的frame也會出現(xiàn)問題顿颅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缸濒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粱腻,更是在濱河造成了極大的恐慌庇配,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栖疑,死亡現(xiàn)場離奇詭異讨永,居然都是意外死亡滔驶,警方通過查閱死者的電腦和手機遇革,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揭糕,“玉大人萝快,你說我怎么就攤上這事≈牵” “怎么了揪漩?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吏口。 經(jīng)常有香客問我奄容,道長,這世上最難降的妖魔是什么产徊? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任昂勒,我火速辦了婚禮,結(jié)果婚禮上舟铜,老公的妹妹穿的比我還像新娘戈盈。我一直安慰自己,他們只是感情好谆刨,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布塘娶。 她就那樣靜靜地躺著,像睡著了一般痊夭。 火紅的嫁衣襯著肌膚如雪刁岸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天她我,我揣著相機與錄音虹曙,去河邊找鬼膝宁。 笑死,一個胖子當(dāng)著我的面吹牛根吁,可吹牛的內(nèi)容都是我干的员淫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼击敌,長吁一口氣:“原來是場噩夢啊……” “哼介返!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沃斤,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤圣蝎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衡瓶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徘公,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年哮针,在試婚紗的時候發(fā)現(xiàn)自己被綠了关面。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡十厢,死狀恐怖等太,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛮放,我是刑警寧澤缩抡,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站包颁,受9級特大地震影響瞻想,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娩嚼,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一蘑险、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧待锈,春花似錦漠其、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至春瞬,卻和暖如春柴信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宽气。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工随常, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潜沦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓绪氛,卻偏偏與公主長得像唆鸡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枣察,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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