IOS7.0 Xcode5 AutoLayout 備忘錄

 

Xcode5 xib設置autolayout方式:ios

列表1:框架

(選擇兩個view時可設置)測試

左邊對齊, spa

右邊對齊, debug

頂部對齊, code

底部對齊, 對象

x軸中心對齊, blog

y軸中心對齊, io

文本底標線對齊, 容器

 

(單選擇一個view時可設置)

對於父view的x軸中心對齊, 

對於父view的y軸中心對齊, 

 

(選擇框)

添加完約束後不進行任何操做,

在添加約束後從新擺放約束涉及到的view,

在添加約束後從新擺放全部這個容器內的view

 

肯定按鈕, 選擇完上面的項目後點擊添加約束

  

上面的十字是"與最近的鄰居的約束", 填上數字, 單擊虛線變成實線就是要添加這個約束.

這裏的"鄰居"是將一個包含子view的父view看作一個裝了一堆積木的盒子, 積木相對於盒子的邊框和其餘的積木都做爲"鄰居"

 

(定義的寬高數據約束)

寬度指定,

高度指定,

 

(定義多個view之間的寬高約束)

寬度相同,

高度相同,

 

(列表, 多個view之間的對齊約束, 等同於前一菜單的內容)

 

(列表, frame更新方式, 等同於前一菜單)

(肯定按鈕, 設置約束後點擊添加)

 

(上半部分菜單的操做對象是當前選中的view, 下半部分的操做對象是選中view內的view)

刷新frame(使用當前已經設置的全部約束),

刷新約束(根據當前的約束和frame, 更新約束的constant值),

添加缺失的約束(自動添加系統認爲你應該添加卻忘記添加的約束, 測試中常常搞出衝突)

重置爲系統建議的約束(清理系統認爲重複/衝突的約束, 測試中常常搞出問題)

清理全部約束(刪除對象上綁定的全部約束)

 

(在添加約束的時候, 刷新哪些視圖)

同級view和父view

子view

 
問題:
 
約束和約束之間會衝突, 不管是xib和xib, xib和代碼, 代碼和代碼.
約束的衝突通常在特定狀況下才會報, 好比豎屏沒問題可是橫屏出現衝突, 也可能xib拖錯上來就衝突之類.
約束衝突系統自動會解決, 一般依靠的是權級, 可是因爲通常狀況使用沒法肯定某一約束應該處於什麼權級, 因此很難設置正確的權級以應對衝突.
約束的衝突, 在系統自動解決時可能相同狀況出現不一樣的處理, 致使某些不能每次都重現的問題.
約束衝突, debug連調時會出現錯誤log, 能夠根據log查找解決衝突.
約束衝突, 在ios6上未見crash, 在ios7上偶發crash.
 
xib和代碼的取捨:
 
autolayout如今已經不是"用不用"的問題, 而是"怎麼用"的問題, 底層框架貌似已經徹底刪除了autoresizemask, 而是自動將autoresizemask轉換爲auto layout 也 就是說, 這種狀況下可使用原來的autoresizemask, 可是系統仍是將他們拿來當autolayout使的, 使用過程當中自動轉換的constraint一樣會遭遇衝突, 衝突致使的問題更加詭異而很差處理

如今我常常碰到的就是, 好比一個控件, 它和它的父view之間使用的autolayout是用代碼指定的, 我能夠肯定constraint的形式, 可是在實現它的時候爲了方便使用了xib處理其內部的view, xib上拖放constraint因爲比較複雜而我還沒有明晰, 會在某些特定的狀況下出現constraint衝突, 系統自動處理衝突時會將權級較低的constraint放棄, 而因爲沒法明確每一條constraint應該處於什麼權級, 常常會出現偶發問題(如豎屏狀況下constraint之間沒有問題, 橫屏過來以後就發現某個控件內的某個label上不當心沒有刪除指定寬度的constraint, 致使變形的控件和控件內label的constraint衝突, 而後引起一系列的連鎖反應)

固然, 使用xib定義viewcontroller一樣要接觸到constraint, 並且每個都須要管理和指定(默認constraint常常會致使衝突)

相關文章
相關標籤/搜索