標籤: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解析