iOS 通過設(shè)定約束優(yōu)先級來改變 Layout 時的動畫.

準(zhǔn)備知識

intrinsic Content Size, 內(nèi)建大小.

控件的內(nèi)置屬性. 像 UILabel 會根據(jù)自己顯示的 text 得出一個 intrinsic size. 普通的 UIView 的 intrinsic content size 的屬性都為 0. 可以通過 ovrride 的方式去設(shè)置自定義 View 的 intrinsic content size.

優(yōu)先級

iOS 當(dāng)中的每一個約束都有一個優(yōu)先級. 當(dāng)兩個約束沖突的時候系統(tǒng)會選擇破壞優(yōu)先級比較低的約束. 如果兩個優(yōu)先級一樣, 那么系統(tǒng)就會隨機(jī)地選擇一個優(yōu)先級, 并拋出一個錯誤:

常見默認(rèn)的優(yōu)先級有, 251(CH屬性), 750(CR屬性), 1000(其他約束). 雖然理論上來說優(yōu)先級只要是 0 ~ 1000 之間的整數(shù)都可以. 但是為了方便, 我們通常只有用比默認(rèn)屬性小 1 的優(yōu)先級, 比如 250, 749, 999.

CHCR 屬性

前面說到有一些控件擁有自己的 intrinsic content size. intrinsic content size 其實(shí)也是一種特殊的約束. 是約束就有優(yōu)先級. 但是跟普通的約束不同, 對 intrinsic size 的破壞分為兩種, 擴(kuò)大和壓縮. 所以 intrinsic size 的優(yōu)先級是由兩個部分組成的. 分為別 Content hugging Priority 和 Compression Resistance Priority.

  • CH: Content Hugging Priority.
    當(dāng)需要擴(kuò)大 intrinsic size 時使用的 priority. 該屬性越高, 控件越不會被拉伸. 默認(rèn)的優(yōu)先級是251
  • CR: Compression Resistance.
    當(dāng)需要縮小 intrinsic size 時使用的 priority. 該屬性越高, 控件越不會被壓縮. 默認(rèn)的優(yōu)先級是750

問題

最近要在 UITableView 是實(shí)現(xiàn)一個 Cell 折疊和展開的效果. 基本的思路就是通過 UITableView 的自適應(yīng)機(jī)制, 通過改變約束的高度來改變, 然后通過 TableView 進(jìn)行update. 簡單實(shí)現(xiàn)后, 功能倒是沒有問題. 但是中間的動畫卻不是期待的樣子.

做了一個 Demo 演示效果.


AutoLayout 約束截圖

約束非常簡單, Cell 里面有一個 UILabel. Label 有 Top 和 Bottom 的約束, Cell 的高度是自適應(yīng)的. 當(dāng)點(diǎn)擊按鈕的時候會調(diào)整 BottomContraints 的數(shù)值來實(shí)現(xiàn)高度變化.
實(shí)現(xiàn)的效果如下:

2016-08-30 14_19_43.gif

可以看到在擴(kuò)大和縮小的時候 Test 2 文字有明顯的跳動. 原因在于變化瞬間, 雖然 bottom constraint 的數(shù)值發(fā)生了改變, 但是 Cell 高度還沒有發(fā)生改變. 所以這個時候不能滿足所有的約束, 那么會選擇破壞一個優(yōu)先級最低的約束. 在垂直方向, 優(yōu)先級最低的約束就是 Label 的 intrinsic conttent size. 所以在縮小時系統(tǒng)選擇擴(kuò)大了 Label 的大小, 因?yàn)槲淖质蔷又械? 所以會看到文字的跳動.

從我們的需求的來說, 我們希望系統(tǒng)破壞的是 bottom 的約束. 想到達(dá)到這個這個目的, 我們只需要將 bottom 的優(yōu)先級設(shè)成比 Label 的Content Hugging Priority 更低就可以了. 將 bottom 的優(yōu)先級設(shè)成250 以后的效果如圖:

修改后的效果圖

Demo 的地址: https://github.com/Guaidaodl/iOS-Demos

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荒椭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖芥牌,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作谭,死亡現(xiàn)場離奇詭異,居然都是意外死亡巢价,警方通過查閱死者的電腦和手機(jī)捷兰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門立叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贡茅,你說我怎么就攤上這事囚巴。” “怎么了友扰?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庶柿。 經(jīng)常有香客問我村怪,道長,這世上最難降的妖魔是什么浮庐? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任甚负,我火速辦了婚禮,結(jié)果婚禮上审残,老公的妹妹穿的比我還像新娘梭域。我一直安慰自己,他們只是感情好搅轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布病涨。 她就那樣靜靜地躺著,像睡著了一般璧坟。 火紅的嫁衣襯著肌膚如雪既穆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天雀鹃,我揣著相機(jī)與錄音幻工,去河邊找鬼。 笑死黎茎,一個胖子當(dāng)著我的面吹牛囊颅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼踢代,長吁一口氣:“原來是場噩夢啊……” “哼盲憎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奸鬓,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤焙畔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后串远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏多,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年澡罚,在試婚紗的時候發(fā)現(xiàn)自己被綠了伸但。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡留搔,死狀恐怖更胖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隔显,我是刑警寧澤却妨,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站括眠,受9級特大地震影響彪标,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掷豺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一捞烟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧当船,春花似錦题画、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抱婉,卻和暖如春档叔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒸绩。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工衙四, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人患亿。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓传蹈,卻偏偏與公主長得像押逼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惦界,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

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