日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AutoLayout(自动布局)详细教程

發(fā)布時間:2024/9/30 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AutoLayout(自动布局)详细教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉載 ?http://www.onevcat.com/2012/09/autoayout/

WWDC 2012 Session筆記——202, 228, 232 AutoLayout(自動布局)入門

?

這是博主的WWDC2012筆記系列中的一篇,完整的筆記列表可以參看這里。如果您是首次來到本站,也許您會有興趣通過RSS,或者通過頁面下方的郵件訂閱的方式訂閱本站。

AutoLayout在去年的WWDC上被引入Cocoa,而在今年的WWDC上,Apple不惜花費了三個Session的前所未見的篇幅來詳細地向開發(fā)者講解AutoLayout在iOS上的應用,是由起原因的:iPhone5的屏幕將變?yōu)?寸,開發(fā)者即將面臨為不同尺寸屏幕進行應用適配的工作。Android平臺開發(fā)中最令人詬病的適配工作的厄運現(xiàn)在似乎也將降臨在iOS開發(fā)者的頭上。基于這樣的情況,Apple大力推廣使用AutoLayout的方法來進行UI布局,以一舉消除適配的煩惱。AutoLayout將是自Interface Builder和StoryBoard之后UI制作上又一次重要的變化,也必然是之后iOS開發(fā)的趨勢,因此這個專題很值得學習。

?

?

AutoLayout是什么?

使用一句Apple的官方定義的話

?

?

AutoLayout是一種基于約束的,描述性的布局系統(tǒng)。

?

Auto Layout Is a Constraint-Based, Descriptive Layout System.

關鍵詞:

?

?

  • 基于約束 - 和以往定義frame的位置和尺寸不同,AutoLayout的位置確定是以所謂相對位置的約束來定義的,比如x坐標為superView的中心,y坐標為屏幕底部上方10像素等
  • 描述性 - 約束的定義和各個view的關系使用接近自然語言或者可視化語言(稍后會提到)的方法來進行描述
  • 布局系統(tǒng) - 即字面意思,用來負責界面的各個元素的位置。

?

?

總而言之,AutoLayout為開發(fā)者提供了一種不同于傳統(tǒng)對于UI元素位置指定的布局方法。以前,不論是在IB里拖放,還是在代碼中寫,每個UIView都會有自己的frame屬性,來定義其在當前視圖中的位置和尺寸。使用AutoLayout的話,就變?yōu)榱耸褂眉s束條件來定義view的位置和尺寸。這樣的最大好處是一舉解決了不同分辨率和屏幕尺寸下view的適配問題,另外也簡化了旋轉時view的位置的定義,原來在底部之上10像素居中的view,不論在旋轉屏幕或是更換設備(iPad或者iPhone5或者以后可能出現(xiàn)的mini iPad)的時候,始終還在底部之上10像素居中的位置,不會發(fā)生變化。

總結

?

?

使用約束條件來描述布局,view的frame會依據(jù)這些約束來進行計算

?

Describe the layout with constraints, and frames are calculated automatically.

?


?

?

AutoLayout和Autoresizing Mask的區(qū)別

Autoresizing Mask是我們的老朋友了…如果你以前一直是代碼寫UI的話,你肯定寫過UIViewAutoresizingFlexibleWidth之類的枚舉;如果你以前用IB比較多的話,一定注意到過每個view的size inspector中都有一個紅色線條的Autoresizing的指示器和相應的動畫縮放的示意圖,這就是Autoresizing Mask。在iOS6之前,關于屏幕旋轉的適配和iPhone,iPad屏幕的自動適配,基本都是由Autoresizing Mask來完成的。但是隨著大家對iOS app的要求越來越高,以及已經(jīng)以及今后可能出現(xiàn)的多種屏幕和分辨率的設備來說,Autoresizing Mask顯得有些落伍和遲鈍了。AutoLayout可以完成所有原來Autoresizing Mask能完成的工作,同時還能夠勝任一些原來無法完成的任務,其中包括:

?

?

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

總結

?

?

Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout還具備一些Autoresizing Mask不具備的優(yōu)良特性,以幫助我們更方便地構建界面。

?

?


?

?

AutoLayout基本使用方法

Interface Builder

最簡單的使用方法是在IB中直接拖。在IB中任意一個view的File inspector下面,都有Use Autolayout的選擇框(沒有的同學可以考慮升級一下Xcode了=。=),鉤上,然后按照平常那樣拖控件就可以了。拖動控件后在左邊的view hierarchy欄中會出現(xiàn)Constraints一向,其中就是所有的約束條件。

選中某個約束條件后,在右邊的Attributes inspector中可以更改約束的條件,距離值和優(yōu)先度等:?

對于沒有自動添加的約束,可以在IB中手動添加。選擇需要添加約束的view,點擊菜單的Edit->Pin里的需要的選項,或者是點擊IB主視圖右下角的按鈕,即可添加格外的約束條件。

可視化的添加不僅很方便直觀,而且基本不會出錯,是優(yōu)先推薦的添加約束的方式。但是有時候只靠IB是無法完成某些約束的添加的(比如跨view hierarchy的約束),有時候IB添加的約束不能滿足要求,這時就需要使用約束的API進行補充。

?

?

手動使用API添加約束

創(chuàng)建

iOS6中新加入了一個類:NSLayoutConstraint,一個形如這樣的約束

?

?

  • item1.attribute = multiplier ? item2.attribute + constant

對應的代碼為

?

?

[NSLayoutConstraint constraintWithItem:buttonattribute:NSLayoutAttributeBottomrelatedBy:NSLayoutRelationEqualtoItem:superviewattribute:NSLayoutAttributeBottommultiplier:1.0constant:-padding]

?

這對應的約束是“button的底部(y) = superview的底部 -10”。

?

?

添加

在創(chuàng)建約束之后,需要將其添加到作用的view上。UIView(當然NSView也一樣)加入了一個新的實例方法:

?

?

  • -(void)addConstraint:(NSLayoutConstraint *)constraint;

用來將約束添加到view。在添加時唯一要注意的是添加的目標view要遵循以下規(guī)則:

?

?

  • 對于兩個同層級view之間的約束關系,添加到他們的父view上

?

?

  • 對于兩個不同層級view之間的約束關系,添加到他們最近的共同父view上

?

?

  • 對于有層次關系的兩個view之間的約束關系,添加到層次較高的父view上

?

?

刷新

可以通過-setNeedsUpdateConstraints和-layoutIfNeeded兩個方法來刷新約束的改變,使UIView重新布局。這和CoreGraphic的-setNeedsDisplay一套東西是一樣的~

?

?

Visual Format Language 可視格式語言

UIKit團隊這次相當有愛,估計他們自己也覺得新加約束的API名字太長了,因此他們發(fā)明了一種新的方式來描述約束條件,十分有趣。這種語言是對視覺描述的一種抽象,大概過程看起來是這樣的:

accept按鈕在cancel按鈕右側默認間距處

最后使用VFL(Visual Format Language)描述變成這樣:

?

?

[NSLayoutConstraint constraintsWithVisualFormat:@"[cancelButton]-[acceptButton]" options:0 metrics:nil views:viewsDictionary];

?

其中viewsDictionary是綁定了view的名字和對象的字典,對于這個例子可以用以下方法得到對應的字典:

?

?

UIButton *cancelButton = ... UIButton *acceptButton = ... viewsDictionary = NSDictionaryOfVariableBindings(cancelButton,acceptButton);

?

生成的字典為

?

?

{ acceptButton = ""; cancelButton = ""; }

當然,不嫌累的話自己手寫也未嘗不可。現(xiàn)在字典啊數(shù)組啊寫法相對簡化了很多了,因此也不復雜。關于Objective-C的新語法,可以參考我之前的一篇WWDC 2012筆記:WWDC 2012 Session筆記——405 Modern Objective-C。

在view名字后面添加括號以及連接處的數(shù)字可以賦予表達式更多意義,以下進行一些舉例:

?

?

  • [cancelButton(72)]-12-[acceptButton(50)]

    • 取消按鈕寬72point,accept按鈕寬50point,它們之間間距12point
  • [wideView(>=60@700)]
    • wideView寬度大于等于60point,該約束條件優(yōu)先級為700(優(yōu)先級最大值為1000,優(yōu)先級越高的約束越先被滿足)
  • V:[redBox][yellowBox(==redBox)]
    • 豎直布局,先是一個redBox,其下方緊接一個寬度等于redBox寬度的yellowBox
  • H:|-[Find]-[FindNext]-[FindField(>=20)]-|
    • 水平布局,Find距離父view左邊緣默認間隔寬度,之后是FindNext距離Find間隔默認寬度;再之后是寬度不小于20的FindField,它和FindNext以及父view右邊緣的間距都是默認寬度。(豎線’|‘ 表示superview的邊緣)

?

?


?

?

容易出現(xiàn)的錯誤

因為涉及約束問題,因此約束模型下的所有可能出現(xiàn)的問題這里都會出現(xiàn),具體來說包括兩種:

?

?

  • Ambiguous Layout 布局不能確定
  • Unsatisfiable Constraints 無法滿足約束

布局不能確定指的是給出的約束條件無法唯一確定一種布局,也即約束條件不足,無法得到唯一的布局結果。這種情況一般添加一些必要的約束或者調整優(yōu)先級可以解決。無法滿足約束的問題來源是有約束條件互相沖突,因此無法同時滿足,需要刪掉一些約束。兩種錯誤在出現(xiàn)時均會導致布局的不穩(wěn)定和錯誤,Ambiguous可以被容忍并且選擇一種可行布局呈現(xiàn)在UI上,Unsatisfiable的話會無法得到UI布局并報錯。

對于不能確定的布局,可以通過調試時暫停程序,在debugger中輸入

?

?

  • po [[UIWindow keyWindow] _autolayoutTrace]

來檢查是否存在Ambiguous Layout以及存在的位置,來幫助添加條件。另外還有一些檢查方法,來查看view的約束和約束狀態(tài):

?

?

  • [view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical]
  • [view hasAmbiguousLayout]
    • [view exerciseAmbiguityInLayout]

?

?


?

?

布局動畫

動畫是UI體驗的重要部分,更改布局以后的動畫也非常關鍵。說到動畫,Core Animation又立功了..自從CA出現(xiàn)以后,所有的動畫效果都非常cheap,在auto layout中情況也和collection view里一樣,很簡單(可以參考WWDC 2012 Session筆記——219 Advanced Collection Views and Building Custom Layouts),只需要把layoutIfNeeded放到animation block中即可~

?

?

[UIView animateWithDuration:0.5 animations:^{[view layoutIfNeeded]; }];

?

如果對block不熟悉的話,可以看看我很早時候寫的一篇block的文章。

- See more at: http://www.onevcat.com/2012/09/autoayout/#sthash.Kv4qjr2T.dpuf

總結

以上是生活随笔為你收集整理的AutoLayout(自动布局)详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。