ios6 引入了自動布局。雖然專案中所用不多。但是還是 早點資料看看 做個總結。 隨著蘋果解析度越來越多。 類似自動布局肯定是越發重要了。
在ios 之前 有「autosizing」 就是 在父view 跟子view 引入了 「spring」 和 「strut」 的概念。 乙個是彈簧? 意思應該是保證距離不會大於某乙個值吧。 另外乙個引數 是支柱。控制距離不小於吧。用這樣的實現自動布局當然也有侷限性。 就是當修改某乙個view的位置等的時候。 也許需要大量的**修改已經存在的自動布局的引數。而且控制起來很困難
自動布局通過建立 多個constraints (約束) 來顯示view。而且不僅僅是父view和子view之間的可以存在約束。同級之間也可以存在約束。甚至可以不再同乙個view上面的2個view也可以建立約束。
constraints不僅可以用明確的數字來表示。 還可以使用大於 小於等等。
constraints存在優先順序0-1000 越大優先順序越高
constraints操作的是view的內容 不是frame 這裡講的是alignment rects 這個東西不是很懂。需要時間去了解。
不過絕大部分正常情況 應該是跟frame相等的。
有的view 存在固定內容大小(比如button 會根據內容大小或者大小改變 內容大小)。constraints會在每個方向上自動分配2個constraints。 乙個是阻止content的大小大於view的大小。另外乙個是 阻止content的大小小於view的大小。content hugging compression resistance priorities;
實際上用下面會說的 可視格式語言表達這個的意思是。當乙個存在固定內容大小的view建立時候後。系統會自動加上4個約束。假設這個view的固定內容大小為100,50。讓這個view不大於固定大小的約束的優先順序是250.讓這個view不小於固定內容大小的約束為750。
h:[label(<=100@250)]
h:[label(>=100@750)]
v:[label(<=50@250)]
v:[label(>=50@750)]
這裡有個疑問 。
查過很多資料。的確都寫的優先順序為250.但是我自己建立的專案貌似是251.
不過應該不是大問題。需要處理這個的時候。避開250,251鐵定沒問題。更何況這個值也是可以修改的。
建立約束的3個方式:
1 在inte***ce builder上面建立約束
首先需要注意的。約束缺一不可。要麼不加約束。要麼必須加全。一旦出現約束缺少或者衝突。都會報錯。
當我們拖動view到介面上面去的時候。可以使用建議約束。
選中需要處理的view,點開下面第三個按鈕。從上面到下的功能分別是:
1.更新frame:當你修改了乙個view的約束的時候。view並不會變成你修改後的位置和大小。選中狀態會有乙個虛線的view。那個是真正的位置。這時候update一下會將view更新成修改後的大小後位置。
2更新 約束:跟上面的情況相反。如果你移動了view。根據現在view的位置重新生成約束。
3新增缺少的約束:如上所說 約束不能缺少。這個方法就是新增缺少的約束。
4重置為建議約束。
5清除約束
當你在介面上建立約束的時候。會有很多線出現。其中
綠色表示好的約束。
橙色表示缺少的約束。
紅色表示衝突的約束。
2 **編輯約束
很多時候 我們不能通過介面上面構建所有的約束。因為有的約束是動態的。這時候我們需要**來構建 寫個例子就行了。
[nslayoutconstraint constraintwithitem:mybutton
attribute:nslayoutattributetrailing
relatedby:nslayoutrelationequal
toitem:mylabel
attribute:nslayoutattributeleading
multiplier:1
constant:-10];
這裡有一些注意點:
1.當你通過**建立出來的物件。會存在預設的約束。再加約束會衝突 需要通過
settranslatesautoresizingmaskintoconstraints:no 來清除
2.通過介面上建立的約束可以 iboutlet 到**中去。
3.約束加到影響的view的共同的父節點的最近的那乙個view上面去。
3.可視格式表達語言
這個可能需要好好看文件就行了。寫個例子吧:
// get a reference to the superview
uiview *superview = self.view;
//create a label
uilabel *mylabel = [[uilabel alloc]init];
[mylabel settranslatesautoresizingmaskintoconstraints:no]; mylabel.text = @"my label";
//create a button
uibutton *mybutton = [uibutton buttonwithtype:uibuttontyperoundedrect];
[mybutton settitle:@"my button" forstate:uicontrolstatenormal]; [mybutton settranslatesautoresizingmaskintoconstraints:no];
//add the button and label to the superview
[superview addsubview:mylabel];
[superview addsubview:mybutton];
// get the views dictionary
nsdictionary *viewsdictionary =
nsdictionaryofvariablebindings(mylabel, mybutton);
//create the constraints using the visual language format nsarray *constraintsarray = [nslayoutconstraint
constraintswithvisualformat:@"|-[mybutton]- [mylabel(==mybutton)]-|"
options:nslayoutformatalignallbaseline metrics:nil views:viewsdictionary];
for (int i = 0; i
[view] 來表示乙個view。
[view1][view2]表示2個view之間的約束
[view1]-[view2]表示2個view之間的間距
[mybutton1]-30-[mybutton2] 這個表示間距30
v:[mylabel]-50-[mybutton] 表示豎直方向。不加v預設是水平方向。當然也可以用 h。
[mybutton(100)] width 為 100;
[mybutton(<=100)] width 小於等於 100
[mylabel(==mybutton2)]mylabel 的width 等於
mybutton2 的寬度。
|-20-[mybutton1]-30-| 豎線表示父view
[mybutton1(>=70@500)] @表示優先順序
IOS自動布局
使用相對布局之後,可以增加開發的速度,一直用frame的方式,混亂。使用相對布局之後,之前以設定frame的方式來取設定view將沒有效果 除了controller的view 同設定frame類似的時,在設定view的約束的時候,也需要制定他的大小和座標,否則,編輯器會提示警告。以實際操作來演示下如...
IOS 自動布局 (上)
最早接觸xcode是4.0 那時候auto layout真不成熟,一直用純 自己寫,從最cgrectgetmaxy,cgrectgetmaxx到現在的第三方,最近時間比較多了,參考了網上列子,研究下了 auto layout 和size classes.auto layout 我覺得使用 auto ...
iOS 自動布局Autolayout
自動布局 autolayout 簡介 在以前的ios程式中,是如何設定布局ui介面的?經常編寫大量的座標計算 為了保證在3.5 inch和4.0 inch螢幕上都能有完美的ui介面效果,有時還需要分別為2種螢幕編寫不同的座標計算 即傳說中的 螢幕適配 什麼是autolayout?autolayout...