iOS開發(fā)初學者入門 | 第七章:設備和自動布局

在這一章節(jié)中,你將會學習如何為不同尺寸設備設計界面尤蒿,我們會介紹所有的蘋果設備及其尺寸。在這一章中你將學會設計的基本知識诵盼,從而可以為應用設計界面土涝。

Screen Sizes(屏幕尺寸)

iOS系統(tǒng)是可以運行在多種設備多種格式下運行验庙,包括iPhone袜刷,iPod Touch议经,iPad和iPad Mini横堡。表格7-1包含了所有的設備及其像素尺寸埋市。

表7-1 設備尺寸

Device Height (px) Width (px)
iPhone 480 320
iPhone 4 (Retina) 960 640
iPhone 5 (Retina) 1136 640
iPhone 6 (Retina) 1334 750
iPhone 6 Plus (Retina HD) 1920 1080
iPad 1024 768
iPad w/ Retina 2048 1536
iPad Mini 1024 768
iPad Mini w/ Retina 2048 1536

Retina Displays(視網膜屏)

Pixels(像素)表示顯示器上可以繪制圖片的基本單位,就像是方格紙上的一個小格子命贴。隨著設備的不斷演進道宅,屏幕上的像素值越來越多。

Page 187

這就意味著屏幕的像素密度越來越高胸蛛,每英寸可呈現(xiàn)的圖像細節(jié)增加污茵。Pixel-per-inch(PPI)像素每英寸為單位來表示影像分辨率的大小。當Steve Jobs發(fā)布iPhone 4時葬项,他說人眼是無法注意到300PPI以上的區(qū)別泞当,iPhone 4 有326PPI,接著蘋果使用Retina來表示超過300PPI的設備民珍,二iPhone 6 Plus有104PPI襟士,用Retina HD表示。

為了幫你管理App上Retina和Retina HD圖片嚷量,蘋果公司提供了文件命名關鍵詞方法:
Image.png
非Retina屏幕設備的標準尺寸圖片
Image@2x.png
Retina屏幕設備的2倍尺寸圖片
Image@3x.png
Retina HD屏幕設備的3倍尺寸圖片

如果你在命名圖片時陋桂,使用了@2x@3x關鍵詞,Xcode會自動為你匹配相應的Retina屏幕和Retina HD屏幕蝶溶。

Swift需要在iOS7或者更高的系統(tǒng)下使用嗜历。iOS 7 只能在iPhone 4 以及更新設備上運行。因為除了iPhone 4,iPhone 4 以上的設備都使用了Retina屏幕梨州,所以我們要保證適配Retina屏幕痕囱。有些iPad也在運行iOS 7,但是不是所有的運行iOS 7的iPad都有Retina屏幕暴匠,iPad Mini和iPad 2都可以運行iOS 7卻不是Retina屏幕咐蝇。所以1027*768這個尺寸,只有在適配非Retina屏幕iPad時才需要考慮巷查。

Orientation(方向)

有許多設備運行iOS,每個設備的屏幕都有四個方向抹腿,一個設備同一時間可以顯示一個方向:
Portrait垂直
這是默認的方向岛请,設備通過這個定位可以讓垂直方向的邊比水平方向的邊要長,Home鍵在設備的底部警绩。
Portrait Upside Down縱向倒置
在這個定位下崇败,設備的垂直方向邊比水平方向邊要長,Home鍵在設備的頂部肩祥。
Landscape Left左橫屏
在這個定位下后室,設備的水平方向的邊比垂直方向的邊要長,Home鍵在設備的左側混狠。

Page 188 | Chapter7 : Devices and Auto Layout

Landscape Right右橫屏
在這個定位下岸霹,設備的水平方向的邊要比垂直方向的邊長,Home鍵在設備的右側将饺。

每個應用都要明確自己支持的方向贡避。選定支持的方向后,應用要調整不同方向下的布局予弧。默認情況下刮吧,支持Portrait,Landscape Left和Landscape Right三個方向。

Universal Apps(通用App)

App需要根據(jù)設備進行適配掖蛤,蘋果提供了三種格式幫助完成適配杀捻。

第一種格式是iPhone App。iPhone App將設計運行在iPhone和iPod Touch上蚓庭。然而致讥,iPhone App也可以運行在iPad上,因為iPad比iPhone有更多的像素彪置,所以iPad要把iPhone上的App用縮放的形式展示拄踪,就是在iPad上出現(xiàn)一個iPhone尺寸大小的窗口,然后App就在這個窗口中運行拳魁,當然惶桐,也可以全屏展示,拉伸或者放大iPhone App,受到像素的影響姚糊,展示效果并不好贿衍。

第二個格式是iPad App。iPad App只能運行在iPad或者iPad Mini上救恨,iPad App無法在iPhone或iPad Touch上運行贸辈,iPad App是專門針對iPad設計開發(fā)的,所以不會出現(xiàn)拉伸變形肠槽。

最后一個格式是通用型App(universal App)擎淤。universal app可以運行在任何尺寸下:iPhone,iPod Touch秸仙,iPad嘴拢,iPad Mini。Universal app對iPhone和iPad各有一個具體的設計界面寂纪。為了幫助開發(fā)者讓他們的設計效果在所有尺寸下都能實現(xiàn)席吴,蘋果提供了Auto Layout自動布局技術。

Auto Layout(自動布局)

自動布局可以給屏幕上的控件進行定位和控制尺寸大小捞蛋。傳統(tǒng)的系統(tǒng)使用固定的坐標和尺寸孝冒,但是Auto Layout使用規(guī)則(rules)來給控件定位。這些規(guī)則(rules)就叫做約束(constraints)拟杉。

約束是有關尺寸和方位的規(guī)則庄涡,例如,Label的左邊距離屏幕左邊有20pts的偏移量搬设。這種基于約束的系統(tǒng)可以讓控件在不同尺寸不同顯示器下自我調整啼染。

想把一個Label放在iPhone 5的右下角,過去的方式是把Label設置成:Y-offset值550焕梅,X-offset值250迹鹅,width值50,height值10(見圖7-1)贞言。

圖7-1 Traditional Label in bottom-right corner of screen in Portrait

Universal Apps | Page 189

當需要考慮不同尺寸和不同方向下的布局時斜棚,這個方法就不行了。如果屏幕轉向橫屏该窗,用這個方法設置的Label無法改變坐標值弟蚀,無法出現(xiàn)在屏幕中了(見圖7-2)。

圖7-2 Traditional Label after Landscape Left rotate

Page 190 | Chapter7 : Devices and Auto Layout

如果是使用Auto Layout來把Label放到右下角酗失,Label不管是在橫屏還是豎屏都會出現(xiàn)(見圖7-3)义钉。

圖7-3 Label in bottom right with Portrait Auto Layout

Auto Layout | Page 191

由于Auto Layout使用約束規(guī)則來約束控件,所以到設備轉向橫屏時规肴,Label就會自動調整定位(見圖7-4)捶闸。

圖7-4 Label in bottom right with Landscape Auto Layout

Attributes(屬性)

我們可以根據(jù)大量不同的屬性來創(chuàng)建約束夜畴。例如,你把Label的右邊距設置為距離containning view邊緣30pts(見圖7-5)删壮。containing view就是把控件封裝在一起的view(視圖)贪绘。除了可以定位到某個控件右邊,還可以定位一個控件的很多屬性央碟。

圖7-5

Page 192 | Chapter7 : Devices and Auto Layout

left(左)税灌、right(右)、top(上)和bottom(下)邊距是比較常見的定位屬性亿虽。例如菱涤,英語是從左向右讀寫的,然而如果你想展示的語言不是從左向右讀寫的洛勉,比如阿拉伯語狸窘,那相應的間隔就需要翻轉過來。除了左邊距和右邊距坯认,蘋果公司還提供了leading和trailing屬性。在從左向右讀寫的語言中氓涣,leading和trailing功能和左邊距右邊距一樣牛哺,在從右向左讀寫的語言中,左邊距右邊距的概念可以用leading和trailing屬性劳吠。

我們還可以基于width(寬)引润、高(height)、centerX(水平居中)和centerY(垂直居中)來創(chuàng)建約束痒玩。寬和高這兩個屬性一般是用來固定或者讓多個控件等比變化淳附,比如你想在屏幕下方一行排列四個按鈕,當屏幕變寬時蠢古,這四個按鈕就會等比變寬奴曙。

cuter和centerY屬性是用來定位一個控件垂直居中或者水平居中。最后baseline屬性只出現(xiàn)在有文字的控件中草讶,指的是一行文字的底部邊界洽糟。

Values(值)

每個約束都必須設定一個值,這個值可以是具體的數(shù)值堕战,也可以是一個范圍坤溃,也可以是Standard Value(標準值)。例如嘱丢,在iPhone上薪介,Standard Value(標準值)可能是20pts,而在iPad上越驻,Standard Value(標準值)可能是25pts汁政。Standard Value(標準值)是由蘋果公司規(guī)定的道偷,會根據(jù)不同的設備和方向進行變化。約束也可以設定為一個具體的數(shù)值烂完,例如试疙,距離Label的leading edge30pts偏移量。Auto Layout也可以支持范圍或者不等量的值抠蚣。例如祝旷,把約束設置為距離leading edge大于等于20pts,隨著視圖變化leading偏移量也會變化嘶窄。最后怀跛,Standard Value(標準值)是默認的距離。

Intrinsic Size(固定尺寸)

在某些情況下柄冲,我們很有必要允許控件能自己調整尺寸大小吻谋,例如,有一個固定寬度的Label现横,顯示的一段英文文字“Tap here to enter”漓拾,當這段話翻譯成德語的“Tippen Sie hier, um geben”,會比英文更長一些戒祠,如果Label設置成固定寬度骇两,那么德語的這段話就會被截掉一節(jié)。

為了避免這種情形發(fā)生姜盈,在Label這個控件中常常出現(xiàn)低千,Auto Layout有了一個Intrinsic Content Size選項,這個選項允許控件基于其內容來自動調整大小馏颂。開啟這個功能方法:在界面上選中Label控件示血,點擊頂部菜單欄Editor,然后點擊Size to Fit Content救拉。

Priority(優(yōu)先級)

在大多數(shù)情況下难审,一個view會有很多約束,屏幕上的控件會按照約束進行自我調整亿絮。在某些情況下剔宪,多個約束彼此矛盾,優(yōu)先級順序決定了我們先使用哪個約束壹无。

Auto Layout | Page 193

Creating Constraints(創(chuàng)建約束)

我們是在Storyboard文件中創(chuàng)建約束葱绒。當我們把控件拖到界面上時,這個控件是沒有任何約束的斗锭。如果在沒有設定約束的情況下運行應用地淀,Xcode就會按照這個控件的絕對位置來定位這個控件,這意味著即使控件里的內容屬性變化了岖是,這個控件也不會移動帮毁。所以為了讓控件能夠根據(jù)情況自我調整实苞,就需要創(chuàng)建約束。每個控件都至少有一個水平和一個垂直的約束烈疚。有很多辦法來給你的控件創(chuàng)建約束黔牵,下面我們來一一介紹。

The Control-Drag Method(Control拖動法)

創(chuàng)建約束最方便的方法就是Control拖動法爷肝,選擇一個控件猾浦,然后按住Control鍵,然后拖動鼠標拖向另外一個控件灯抛,接著彈出一個菜單窗口(見圖7-6)金赦,根據(jù)你拖動的方向,彈出框中菜單選項內容也會不同对嚼。

圖7-6 彈出的約束菜單選項

如果你是向右拖動夹抗,就會出現(xiàn)一個Trailing Space Constraint選項。如果你是向左拖動纵竖,就會出現(xiàn)一個Leading Space Constraint選項漠烧。不管你向左還是向右拖動,都會出現(xiàn)垂直居中對齊(Center Vertically in Container)選項靡砌。而向上拖就會出現(xiàn)Top Space Constraint選項已脓,向下拖就會出現(xiàn)Bottom Space Constraint選項。不管你向上還是向下拖動乏奥,都會出現(xiàn)水平居中對齊選項(Center Horizontally in Container)選項。

Auto Layout Buttons(自動布局按鈕)

當然我們也可以通過Storyboard Editor編輯器右下角的Auto Layout菜單來創(chuàng)建約束(見圖7-7)亥曹。Auto Layout菜單有四個按鈕邓了,用來給控件增加自動布局的約束。

圖7-7 Auto Layout菜單

Page 194 | Chapter7 : Devices and Auto Layout

The Align button

從左邊起第一個按鈕就是Align按鈕媳瞪,這個按鈕是可以創(chuàng)建有關對齊要求的約束骗炉,例如讓某個view居中,或者讓多個相鄰的view邊對齊蛇受。

要使用這個按鈕句葵,首先先選定一個控件,點擊最左邊的這個Align按鈕兢仰,然后彈出Align選項窗口乍丈,顯示可能創(chuàng)建的約束(見圖7-8)。勾選某個選項后在選項后面的輸入框填寫上偏移量把将,這個文本框同樣也可提供一個下拉菜單?轻专,有Canvas(畫布)和Standard Value標準數(shù)值2個選項。Canvas選項會根據(jù)你目前界面上控件當前的位置進行計算出偏移量察蹲,Standard Value是蘋果公司根據(jù)最佳實踐原則提供的尺寸请垛,能夠根據(jù)不同的設備進行變化催训。點擊Add Constraints,就成功添加約束了宗收。

圖7-8 Align選項窗口

The Pin button

第二個按鈕是Pin按鈕漫拭。Pin按鈕用來創(chuàng)建有關兩個控件的距離或者控件寬高的約束。點擊Pin按鈕彈出Pin選項窗口混稽,Pin選項從上到下有幾個不同的部分采驻。

所選控件距離上下左右的偏移量的約束,是由最上面的這部分部分來創(chuàng)建荚坞。

Creating Constraints | Page 195

最上面這部分的輸入框中輸入數(shù)值挑宠,上下左右四個方向,每個方向都可以創(chuàng)建約束颓影。這個地方有個棘手的問題值得注意各淀,就是在創(chuàng)建約束的時候,你需要勾選輸入框和小方塊之間的紅線诡挂,勾選后碎浇,紅線會變粗(見圖7-9)。勾選紅線后璃俗,彈出框最下面的文案會更新為“Add 1 Constraint”奴璃。

圖7-9 Pin選項

從上往下第二部分是用來給控件設定固定的寬高約束,使用設定固定寬城豁、高功能時要格外小心苟穆,尤其是在Label控件上,Label固定寬有時候會讓Label的文字內容被意外截斷唱星。

從上往下第三部分是用來給多個控件設置等寬雳旅、等高、寬高縱橫比间聊,寬高縱橫比約束功能是某個控件尺寸變化后攒盈,寬高比不會變化。

Align彈出框和Pin彈出框中都有Update Frames選項哎榴,點擊Update Frames選項后型豁,根據(jù)你更新的約束條件,讓控件按照新的約束條件進行位置和尺寸的變化尚蝌。你可以選擇讓所有的控件都按照新的條件進行調整迎变,或者是僅限于讓新的約束條件所影響的控件進行調整。

Pin選項中最后一個選項是Align選項飘言,在創(chuàng)建約束時氏豌,這個選項最有幫助我們會經常用到。選中2個控件热凹,Align選項會提供基于2個控件的對齊屬性泵喘。想讓一組左對齊的Label能夠平均地放在一起泪电,就可以使用這個選項。

Page 196 | Chapter7 : Devices and Auto Layout

The Resolve Auto Layout Issues button

Auto Layout菜單從左往右第三個按鈕是Resolve Auto Layout Issues按鈕纪铺。這個按鈕用來幫助我們修復Auto Layout中出現(xiàn)的問題(issues)相速,它會提供修改建議,重新設置約束條件鲜锚。還能基于當前界面中各個控件的當前位置進行分析生成創(chuàng)建約束突诬。

Issues菜單分成上下兩部分菜單(見圖7-10)。上半部分的設置只影響到你所選中的控件芜繁,下半部分的設置會影響到所有的控件旺隙。Issue菜單中最有幫助的是“Reset to Suggested Constraints”選項。這個選項能夠刪除當前所有的約束然后基于當前控件的位置創(chuàng)建新的約束骏令。這個選項是一個偉大的起點蔬捷,允許約束在創(chuàng)建后可以被編輯。

圖7-10 Issues menu Issues菜單

The Resizing Behavior button

最后一個按鈕是Resizing Behavior按鈕榔袋,點擊這個按鈕會彈出Resizing Behavior菜單周拐,主要用來控制如何應用實現(xiàn)約束條件(見圖7-11)。根據(jù)你選擇控件的數(shù)量凰兑,有些功能是不能使用的妥粟。例如,equal widths選項能夠讓多個控件具有相同的寬吏够,如果你選中了一個控件后勾给,這個功能就不能使用。

圖7-11 Resizing Behavior 菜單

The Guidelines Method(輔助線方法)

當你在界面上來定位一個控件時锅知,會出現(xiàn)垂直居中和水平居中兩條輔助線(見圖7-12)播急。Xcode提供的輔助線能夠為你自動生成一些約束。

圖7-12 輔助線

Creating Constraints | Page 197

有線喉镰,我們要使用輔助線來定位一個控件旅择,接著點擊Resolve Auto Layout按鈕(長得看起來像是兩個翅膀之間有個三角)惭笑,出現(xiàn)彈出框選項菜單侣姆,滑倒頂部選擇“Reset to Sugested Constraints”(見圖7-13)。這個選項會讓Xcode刪除目前的約束然后根據(jù)輔助線定義的位置自動創(chuàng)建新的約束沉噩。點開Document Outline捺宗,能看到所有的約束條件。

圖7-13 有輔助線的控件

Page 198 | Chapter7 : Devices and Auto Layout

Testing Layout Constraints(檢測Layout約束條件)

當你使用Auto Layout來定位一個控件川蒙,約束會通過顏色來提供反饋蚜厉。如果約束的顏色是橘黃色的,表示目前的約束條件還不充分畜眨,需要更多的約束才能正確的定位這個控件昼牛,如果線是紅色的术瓮,那么表示當前的約束是錯誤的(見圖7-14)。

圖7-14 橘黃色約束

Testing Layout Constraints | Page 199

點擊Document Outline贰健,會出現(xiàn)黃色三角圖標或者紅色圓圈圖標胞四,這表示Auto Layout有了問題(Issue)。點擊圖標會出現(xiàn)問題清單伶椿,列出問題辜伟、原因(見圖7-15)。

圖7-15 約束錯誤和約束警告

點擊issue旁邊的圖標脊另,會出現(xiàn)Fix-It彈出框(見圖7-16)导狡。彈出框展示建議的解決方法,點擊Fix按鈕會自動修復問題偎痛。一定要調查一下它給的建議旱捧,有時候它的建議并不是在所有的設備上能達到你想要的效果。

圖7-16 Fix-It約束

Previewing(預覽)

在多種屏幕尺寸來測試你的界面看彼,這點很重要廊佩。為此Xcode提供了一個Previewer(預覽窗口),展示在多個設備下具體的效果(見圖7-17)靖榕。要打開Previewer标锄,首先要隱藏Inspector,接著點擊Assistant Editor茁计,右邊出現(xiàn)了一個窗口料皇,點擊這個窗口上方的Automatic按鈕,下滑出一個窗口星压,點擊Preview践剂。右邊的這個窗口展示當前界面在設備上的效果,點擊左下角的加號娜膘,可以添加更多的設備逊脯。

圖7-17 Previewer

Page 200 | Chapter7 : Devices and Auto Layout

Exercise: Building More on the Passport App

練習請見此鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竣贪,隨后出現(xiàn)的幾起案子军洼,更是在濱河造成了極大的恐慌,老刑警劉巖演怎,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匕争,死亡現(xiàn)場離奇詭異,居然都是意外死亡爷耀,警方通過查閱死者的電腦和手機甘桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跑杭,你說我怎么就攤上這事铆帽。” “怎么了德谅?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵锄贼,是天一觀的道長。 經常有香客問我女阀,道長宅荤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任浸策,我火速辦了婚禮冯键,結果婚禮上,老公的妹妹穿的比我還像新娘庸汗。我一直安慰自己惫确,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布蚯舱。 她就那樣靜靜地躺著改化,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枉昏。 梳的紋絲不亂的頭發(fā)上陈肛,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音兄裂,去河邊找鬼句旱。 笑死,一個胖子當著我的面吹牛晰奖,可吹牛的內容都是我干的谈撒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼匾南,長吁一口氣:“原來是場噩夢啊……” “哼啃匿!你這毒婦竟也來了?” 一聲冷哼從身側響起蛆楞,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤溯乒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臊岸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橙数,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尊流,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年帅戒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡逻住,死狀恐怖钟哥,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瞎访,我是刑警寧澤腻贰,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站扒秸,受9級特大地震影響播演,放射性物質發(fā)生泄漏。R本人自食惡果不足惜伴奥,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一写烤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拾徙,春花似錦洲炊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崖瞭,卻和暖如春狂巢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背书聚。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工隧膘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寺惫。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓疹吃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親西雀。 傳聞我的和親對象是個殘疾皇子萨驶,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容