成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS 9: UIStackView入門

移動(dòng)開發(fā) iOS
同iOS以往每個(gè)迭代一樣,iOS 9帶來了很多新特性。UIKit框架每個(gè)版本都在改變,而在iOS 9比較特別的是UIStackView,它將從根本上改變開發(fā)者在iOS上創(chuàng)建用戶界面的方式。本文將帶你學(xué)習(xí)怎樣使用UIStackView創(chuàng)建用戶界面。

[[138778]]

同iOS以往每個(gè)迭代一樣,iOS 9帶來了很多新特性。UIKit框架每個(gè)版本都在改變,而在iOS 9比較特別的是UIStackView,它將從根本上改變開發(fā)者在iOS上創(chuàng)建用戶界面的方式。本文將帶你學(xué)習(xí)怎樣使用UIStackView創(chuàng)建用戶界面。

 

 

本文假定你已經(jīng)熟悉Auto Layout基礎(chǔ)。不熟悉的可以先看看Auto Layout教程。要理解Stack View為何如此有用及它是如何起作用的,需要首先對Auto Layout有深入了解。

 

1. 實(shí)例預(yù)覽

我們將使用UIStackView模擬一個(gè)app評分提示。用戶可以增加星星或者移除星星來打分。完成后看起來是這樣。

先從GitHub下載樣例工程并打開。在Main.Storyboard里有兩個(gè)Stack View

我們將使用這兩個(gè)Stack View來布局界面。開始編碼前,讓我們先看一下Stack View是如何工作的。

2. UIStackView 概述

Stack View的核心便是方便垂直或水平排布多個(gè)subview,如果你做過Android開發(fā),那它和LinearLayout 控件非常相似。

Stack View最有用的就是它會自動(dòng)為每個(gè)subview創(chuàng)建和添加Auto Layout constraints。當(dāng)然你可以控制subview的大小和位置。可以通過選項(xiàng)配置subview的大小、排布以及彼此間的間距。

布局內(nèi)容

打開Main.Storyboard,選擇其中一個(gè)Stack View可以查看其選項(xiàng),并選中一個(gè)Stack View。在 Attributes Inspector中,注意Stack View下面列出的選擇。

Axis表示Stack View的subview是水平排布還是垂直排布。Alignment控制subview對齊方式。Distribution定義subview的分布方式。Spacing 為subview間的最小間距。

把術(shù)語簡化一下,你可這樣理解:Alignment 用于控制X 和 Y值,而Distribution 用于控制高度和寬度。另兩個(gè)值都會影響對齊。如果選中Baseline Relative將根據(jù)subview的基線調(diào)整垂直間距。如果選中Layout Margins Relative 將相對于標(biāo)準(zhǔn)邊界空白來調(diào)整subview位置。

另一個(gè)需要記住的是,Stack View會被當(dāng)成Container View。所以它是一個(gè)不會被渲染的UIView子類。它不像其他UIView子類一樣,會被渲染到屏幕上。這也意味著設(shè)置其backgroundColor屬性或重載drawRect:方法都不會產(chǎn)生任何效果。

subView和arrangedSubView

開始使用Stack View前,我們先看一下它的屬性subViews和arrangedSubvies屬性的不同。如果你想添加一個(gè)subview給Stack View管理,你應(yīng)該調(diào)用addArrangedSubview:或insertArrangedSubview:atIndex: arrangedSubviews數(shù)組是subviews屬性的子集。

要移除Stack View管理的subview,需要調(diào)用removeArrangedSubview:和removeFromSuperview。移除arrangedSubview只是確保Stack View不再管理其約束,而非從視圖層次結(jié)構(gòu)中刪除,理解這一點(diǎn)非常重要。

現(xiàn)在我們對Stack View有一定了解,開始使用它。

3. 配置垂直布局的Stack View

打開Main.Storyboard選擇上面的Stack View。對Attributes Inspector作如下改變:

Alignment 設(shè)為 Center

Distribution 設(shè)為 Equal Spacing

Spacing 設(shè)為 30

這告訴Stack View為subview添加約束,使其垂直居中并沿Stack View的軸線對稱,然后為subview設(shè)置邊距30。

如果subview大小和Stack View內(nèi)容區(qū)不相符,將根據(jù)compression resistance priorities對subview進(jìn)行拉伸或壓縮。在運(yùn)行時(shí)給Stack View添加subview也同樣會如此。

布局有任何歧義Stack View都會根據(jù)subview在arrangedSubviews中index一步步回退去調(diào)整subview的大小,直至其剛好適應(yīng)Stack View的大小。

4. 給Stack View添加垂直布局的Subview

添加一個(gè)label,一個(gè)image view和一個(gè)button到上面的Stack View里。label在最上面,image view在中間,button在下面。添加完成后看起來是這樣:

接下來,我們要在Attributes Inspector里修改一下剛才添加的subview的屬性。把label的文本秘訣成“How do you likeour app?”, Text Alignment選擇Center 。image view的Image 輸入“logo”, Content Mode選Aspect Fit。最后把button的Text 設(shè)置成“Add Star!”。

運(yùn)行app。能看到我們只做了很少工作,但已經(jīng)添加了三個(gè)能響應(yīng)方向、size class等改變的subview。事實(shí)上你并不需手動(dòng)添加任何約束。

當(dāng)app運(yùn)行時(shí),點(diǎn)擊Xcode窗口底部Debug View Hierarchy按鈕可以進(jìn)行實(shí)時(shí)視圖調(diào)試

選擇先前添加的任意一個(gè)subview。查看size inspector,我們注意到Stack View已經(jīng)自動(dòng)為其添加了約束。下圖顯示的是為button添加的約束

5. 添加五角星

按鈕事件還沒和app界面關(guān)聯(lián),我們先關(guān)聯(lián)起來。停止運(yùn)行app,打開storyboard。創(chuàng)建一個(gè)名為addStar的IBAction 關(guān)聯(lián)到按鈕的Touch Up Inside事件。

addStar(_:)方法實(shí)現(xiàn):

  1. @IBAction func addStar(sender: AnyObject) { 
  2. let starImgVw:UIImageView = UIImageView(image: UIImage(named: "star")) 
  3. self.horizontalStackView.addArrangedSubview(starImgVw) 
  4. UIView.animateWithDuration(0.25, animations: { 
  5. self.horizontalStackView.layoutIfNeeded() 
  6. }) 

給水平布局的Stack View里的星星image添加動(dòng)畫。記住,由于Stack View自動(dòng)為我們管理Auto Layout constraints,我們只能調(diào)用layoutIfNeeded來實(shí)現(xiàn)動(dòng)畫。

編譯運(yùn)行app,點(diǎn)擊add star按鈕。能看到最后結(jié)果卻不盡人意。

選擇下面的Stack View,查看Attributes Inspector會看到問題所在。由于Alignment 和Distribution 都設(shè)置成了Fill,Stack View 拉伸了星星以適應(yīng)其大小。

這在添加更多的星星的時(shí)候會引起更多問題。我們希望星星居中顯示,而不是被拉伸來適應(yīng)Stack View的寬度。

修改Alignment 的值為Center ,修改Distribution 的值為Fill Equally。最后在addStar(_:)方法中設(shè)置image view的內(nèi)容。

  1. @IBAction func addStar(sender: AnyObject) { 
  2. let starImgVw:UIImageView = UIImageView(image: UIImage(named: "star")) 
  3. starImgVw.contentMode = .ScaleAspectFit 
  4. self.horizontalStackView.addArrangedSubview(starImgVw) 
  5. UIView.animateWithDuration(0.25, animations: { 
  6. self.horizontalStackView.layoutIfNeeded() 
  7. }) 

運(yùn)行app,點(diǎn)幾次添加按鈕,我們發(fā)現(xiàn)所有星星居中了。

6. Stack View嵌套

不能刪除星星,我們的app評分什么用處不大。打開storyboard,添加一個(gè)水平布局的Stack View到上面的Stack View里。把它放置在logo之下,按鈕之上。

把“Add Star!”按鈕拖到新添加的Stack View里,再添加一個(gè)按鈕到新的Stack View里。改變按鈕的title為“Remove Star”,文本顏色設(shè)為red。預(yù)覽如下:

在Attributes Inspector中編輯新Stack View的屬性,改變?nèi)缦拢?/p>

Alignment 設(shè)為 Center

Distribution 設(shè)為 Equal Spacing

Spacing 設(shè)為 10

7. 刪除五角星

為“Remove Star”按鈕創(chuàng)建名為removeStar,事件類型為Touch Up Inside的IBAction響應(yīng)方法。

removeAction(_:)實(shí)現(xiàn):

  1. @IBAction func removeStar(sender: AnyObject) { 
  2. let star:UIView? = self.horizontalStackView.arrangedSubviews.last 
  3. if let aStar = star 
  4. self.horizontalStackView.removeArrangedSubview(aStar) 
  5. aStar.removeFromSuperview() 
  6. UIView.animateWithDuration(0.25, animations: { 
  7. self.horizontalStackView.layoutIfNeeded() 
  8. }) 

運(yùn)行app,現(xiàn)在既可增加,也可刪除了。改變模擬器方向或者旋轉(zhuǎn)設(shè)備看看app會怎樣調(diào)整其界面。我們并未添加一行約束就構(gòu)建好了app的用戶界面。

需要注意的是:removeStar(_:)里調(diào)用removeFromSuperview是把subview從視圖層級中移除。再次調(diào)用removeArrangedSubview(_:)只是告訴Stack View不再需要管理subview的約束。而subview會一直保持在視圖層級結(jié)構(gòu)中直到調(diào)用removeFromSuperview把它移除。

結(jié)論

UIStackView類大大簡化了用戶界面開發(fā)。這是好事,特別是隨著硬件的改變。使用UIStackView,減少了開發(fā)者為簡單場景設(shè)置枯燥的約束,把繁雜的工作交給了UIKit。

【編輯推薦】

 

  1. 蘋果向開發(fā)者發(fā)布 iOS 9 第二個(gè)測試版
  2. iOS 9適配系列教程:后臺定位
  3. iOS 9 新增 UIStackView 官方文檔翻譯

 

【責(zé)任編輯:chenqingxiang TEL:(010)68476606】

責(zé)任編輯:chenqingxiang 來源: CocoaChina
相關(guān)推薦

2015-07-02 16:10:11

UIStackViewiOS 9

2015-08-20 09:19:46

ios9uistackview

2015-08-03 10:03:09

iosuistack vie

2016-03-18 11:19:57

ios9replaykit入門

2015-07-14 16:15:22

2015-09-23 10:30:44

iOS 9UIStack Vie

2015-07-14 17:21:19

IOS 9分屏

2015-07-14 17:17:21

IOS 9分屏

2015-09-28 11:23:09

iOS8iOS 9 開發(fā)

2011-05-16 14:52:19

DB2 9 Viper

2022-09-26 08:25:56

監(jiān)控平臺微服務(wù)

2015-10-16 14:27:29

iOS9collectionV特性

2015-07-13 16:56:40

IOS 9適配教程

2015-09-18 10:28:02

iOS 9 字體

2015-07-16 12:59:19

IOS9UIDynamics

2015-06-17 10:41:50

2016-09-27 20:09:56

2013-09-13 13:16:05

2015-07-02 17:32:28

iOS 9蘋果

2015-08-20 09:00:23

ios9api
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品国产第一综合99久久 | 精品视频成人 | 欧美一级二级在线观看 | 亚洲自拍偷拍欧美 | 一区二区三区欧美在线 | 日韩午夜精品 | 中国一级毛片免费 | 亚洲福利一区 | 国产网站在线播放 | 日韩福利电影 | 成人av播放 | 亚洲啊v | 国产精品96久久久久久 | 性一交一乱一透一a级 | 国产成人精品一区二区三区视频 | 日韩精品一区二区三区在线观看 | 国产精品欧美大片 | 精品欧美色视频网站在线观看 | 国产精品久久久久久久久久久久久久 | 在线欧美一区二区 | 狠狠躁18三区二区一区 | 亚洲精品天堂 | 日韩不卡在线 | 久久久激情 | 久久一二区 | 午夜看看 | 91玖玖| 日韩在线小视频 | 97精品超碰一区二区三区 | 国产区一区二区三区 | 久在线 | 久久美女网 | 在线综合视频 | 欧美日韩在线观看一区 | 日韩久久久久 | 精品久久久久久久人人人人传媒 | 亚洲大片 | 日本精品裸体写真集在线观看 | 久久国产精品一区二区三区 | 亚洲精品日日夜夜 | 天天看天天操 |