iOS AutoLayout解析

來源:互聯網
上載者:User

標籤:des   blog   http   io   os   使用   ar   for   strong   

==========AutoLayout && Layout Constraints=====(available 6.0)

--AutoLayout是一種基於約束的,描述性的布局系統。 Auto Layout Is a Constraint-Based, Descriptive Layout System.

--工作原理:Auto Layout用所有的這些constraints來對你所有的view做一些數學計算以致view達到一個理想的位置以及尺寸。 你不再需要自己來設定view的frame-Auto Layout會幫你做這一切-完全基於你對view所設定的constraints

--理念:通過目的來設計.當你通過目的來設計時, 你在表達的是你想要達到的目標是什麼而不是如何來完成目標。在以前會是這麼個說法:“這個按鈕的左上方的座標是(20, 230)”, 現在你可以這麼表達了:“這個按鈕在它的superview中垂直置中,把他放置在離它的superview左邊緣的一個固定位置。”

--與Autosizing masks聯絡區別

--Autosizing masks是AutoLayout的子集。

--1.AutoLayout可以指定任意兩個view的相對位置,而不需要像Autoresizing Mask那樣需要兩個view在直系的view hierarchy中。
--2.AutoLayout不必須指定相等關係的約束,它可以指定非相等約束(大於或者小於等);而Autoresizing Mask所能做的布局只能是相等條件的。
--3.AutoLayout可以指定約束的優先順序,計算frame時將優先按照滿足優先順序高的條件進行計算。

--使用Autosizing masks(xib):

--Align:

(選擇兩個view時可設定) 左邊對齊, 右邊對齊, 頂部對齊, 底部對齊, 

-----------------------------------------------------------------------
(選擇兩個view時可設定) x軸中心對齊, y軸中心對齊, 文本底標線對齊,

-----------------------------------------------------------------------
(單選擇一個view時可設定)對於父view的x軸中心對齊, 對於父view的y軸中心對齊
-----------------------------------------------------------------------

更新(frame)選項:添加完約束後不進行任何操作  + 在添加約束後重新擺放約束涉及到的view  + 添加約束後重新擺放所有這個容器內的view

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

--Pin

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

這裡的"鄰居"是將一個包含子view的父view看做一個裝了一堆積木的盒子, 積木相對於盒子的邊框和其他的積木都作為"鄰居"。相當 Editor->Pin裡面Horizontal Spacing/vertical spacing 跟Leading/Trailing/Top/Bottom Space to Superview結合

-----------------------------------------------------------------------
(定義的寬高資料約束):寬度指定,高度指定;
-----------------------------------------------------------------------
(定義多個view之間的寬高約束):寬度相同,高度相同;

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

更新(frame)選項 + 確定按鈕  同上。

--Resolve Auto Layout Issues

(上半部分菜單的操作對象是當前選中的view, 下半部分的操作對象是選中view內的view)
--重新整理frame(使用當前已經設定的所有約束),
--重新整理約束(根據當前的約束和frame, 更新約束的constant值),
--添加缺失的約束(自動添加系統認為你應該添加卻忘記添加的約束, 測試中經常搞出衝突)
--重設為系統建議的約束(清理系統認為重複/衝突的約束, 測試中經常搞出問題)
--清理所有約束(刪除對象上綁定的所有約束)

 

--Constraints設定

(在添加約束的時候, 重新整理哪些視圖)
--同級view和父view
--子view

======備忘======

--0.當某個View的constraints太少,計算不出它的位置和尺寸時,xcode會警告(也叫Root View’s Layout Issues)。Resolve a root view’s layout issues by resolving the layout issues of its subviews。詳見“dock右上方箭頭”(Choose Editor > Show Document Outline > Click the arrow next to the root view with the layout issues)。

--1.Auto Layout能支援不同語言;

--2.固有尺寸內容:在 Auto Layout 裡會先問你的空間他們有多大,然後在基於空間給出的資訊將他們展示到螢幕上去。你也可以不使用它,但你要明確設定這個空間的Width 或者 Height constraint。如果你這麼做了,那麼 Interface Builder 為自動產生一個你設定的constraint。如果想要再次恢複固有內容尺寸的話,你只需重新使用Size to Fit Content 

--3.約束和約束之間會衝突, 無論是xib和xib, xib和代碼, 代碼和代碼. 當某個View有太多的constraints,得到錯誤 “Unable to simultaneously satisfy constraints”,表示有衝突。

--4.約束衝突系統自動會解決, 通常依靠的是權級, 但是由於一般情況使用無法確定某一約束應該處於什麼權級, 所以很難設定正確的權級以應對衝突.
--5.約束衝突, 在ios6上未見crash, 在ios7上偶發crash.

--6.有一種警告“Frame for "XX" will be different at run time.”。它的Expected  frame只是你在Size inspector 裡面設定的,Actual是根據你添加constraints算出來的,解決警告只需在“Resolve Auto Layout Issues”裡面重新整理一下frame,講Expected變為Actual的。

 

[NSLayoutConstraint constraintWithItem:(id)item
attribute:(NSLayoutAttribute)attribute
relatedBy:(NSLayoutRelation)relation
toItem:(id)otherItem
attribute:(NSLayoutAttribute)otherAttribute
multiplier:(CGFloat)multiplier
constant:(CGFloat)constant]


參數說明:
第一個參數:指定約束左邊的視圖view1
第二個參數:指定view1的屬性attr1,具體屬性見文末。
第三個參數:指定左右兩邊的視圖的關係relation,具體關係見文末。
第四個參數:指定約束右邊的視圖view2
第五個參數:指定view2的屬性attr2,具體屬性見文末。
第六個參數:指定一個與view2屬性相乘的乘數multiplier
第七個參數:指定一個與view2屬性相加的浮點數constant

這個函數的對照公式為:
view1.attr1 <relation> view2.attr2 * multiplier + constant

注意:
1.如果你想設定的約束裡不需要第二個view,要將第四個參數設為nil,第五個參數設為NSLayoutAttributeNotAnAttribute

舉例:
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeRight
multiplier:1
constant:10]

翻譯過來就是:view1的左側,在,view2的右側,再多10個點,的地方。

附視圖的屬性和關係的值:

typedef NS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1, //小於等於
NSLayoutRelationEqual = 0, //等於
NSLayoutRelationGreaterThanOrEqual = 1, //大於等於
};
typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1, //左側
NSLayoutAttributeRight, //右側
NSLayoutAttributeTop, //上方
NSLayoutAttributeBottom, //下方
NSLayoutAttributeLeading, //首部
NSLayoutAttributeTrailing, //尾部
NSLayoutAttributeWidth, //寬度
NSLayoutAttributeHeight, //高度
NSLayoutAttributeCenterX, //X軸中心
NSLayoutAttributeCenterY, //Y軸中心
NSLayoutAttributeBaseline, //文本底標線

NSLayoutAttributeNotAnAttribute = 0 //沒有屬性
};

  

iOS AutoLayout解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.