ios 自動布局小結

2021-06-29 00:28:18 字數 3926 閱讀 7757

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...