ios開發(fā)之IPAD布局問題

1.項(xiàng)目可以通過設(shè)置Device來選擇部署的平臺(tái)

1> 選擇iPhone(說明項(xiàng)目是用于在iPhone上展示的),該項(xiàng)目可以在iPad上運(yùn)行,但是界面邊緣有黑邊,用戶體驗(yàn)較差

2> 選擇iPad(說明項(xiàng)目是用于在iPad上展示的),該項(xiàng)目不可以在iPhone上運(yùn)行,體現(xiàn)在AppStore上,下載的APP不能安裝在iPhone上

3> 選擇Universal,該項(xiàng)目既可以在iPhone也可以在iPad上運(yùn)行

#pragma mark - 一. UIStackView

#pragma mark 1. UIStackView介紹

概念: 一個(gè)用于堆疊視圖的容器? iOS9的API

用途: StackView及其子視圖可以進(jìn)行界面自適應(yīng),主要用于"減少"設(shè)置約束的工作量

特點(diǎn):

1> 類似containerView,不能在界面上進(jìn)行渲染

2> stackView中的子視圖只能朝一個(gè)方向進(jìn)行排列? 要么水平要么豎直

3> stackview可以進(jìn)行嵌套

4> stackView自適應(yīng)的優(yōu)先級(jí)要低于手動(dòng)設(shè)置約束(使用stackView后不能再通過frame來改變尺寸),可以通過設(shè)置約束來調(diào)整stackView進(jìn)行的自適應(yīng)處理

5> stackView支持屬性動(dòng)畫

6> stackView不支持滾動(dòng)

#pragma mark 2. UIStackView基本布局

Axis : 軸 用于設(shè)置子視圖的排列方向? 水平/豎直

Aligment : 對(duì)齊 用于設(shè)置子視圖的對(duì)齊方式

Distribution : 分布 用于設(shè)置子視圖的分布(排列方向上的填充)方式

Spacing: 設(shè)置子視圖之間的間距

#pragma mark 3. UIStackView分屏適配(Sizeclass)

1.iPad的分屏技術(shù)? iOS9的API

1> 可以讓iPad前臺(tái)同時(shí)有兩個(gè)APP運(yùn)行 實(shí)現(xiàn)真正的多任務(wù)處理

2> 硬件要求 必須在iPad Air2及以上

3> Xcode Bug: 如果項(xiàng)目一開始選擇的不是Universal,則修改成Universal以后也無法支持iPad分屏

2.iPad分屏適配

1> 分屏界面展示原則: iPad分屏?xí)r,會(huì)按照iPhone豎屏的展示樣式(對(duì)應(yīng)的SizeClass)進(jìn)行展示

2> 抗壓優(yōu)先級(jí): 當(dāng)控件進(jìn)行布局時(shí),如果空間產(chǎn)生競(jìng)爭(zhēng)關(guān)系,則抗壓優(yōu)先級(jí)越高,抗擠壓能力越強(qiáng),空間競(jìng)爭(zhēng)時(shí),就會(huì)先擠壓其他優(yōu)先級(jí)低的控件? 默認(rèn)750

3> 設(shè)置iPhone豎屏樣式下StackView的的Axis屬性

class ViewController: UIViewController {

//底部stackView

@IBOutlet weak var bottomStackView: UIStackView!

//展示大圖

@IBOutlet weak var showImgV: UIImageView!

override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.

}

//點(diǎn)擊切換大圖

@IBAction func clickShowImgBtn(sender: UIButton) {

//獲取圖片

let img = UIImage(named: "skirts_0\(sender.tag)")

//展示大圖

showImgV.image = img

//動(dòng)畫漸變

showImgV.alpha = 0.5

UIView.animateWithDuration(0.3) { () -> Void in

self.showImgV.alpha = 1.0

}

}

//將底部stackView以動(dòng)畫的形式改成豎向排列

@IBAction func clickAddStarBtn(sender: AnyObject) {

UIView.animateWithDuration(0.3) { () -> Void in

self.bottomStackView.axis = .Vertical

}

}

//將底部stackView以動(dòng)畫的形式改成橫向排列

@IBAction func clickBuyBtn(sender: AnyObject) {

UIView.animateWithDuration(0.3) { () -> Void in

self.bottomStackView.axis = .Horizontal

}

}

}

#pragma mark 4. UIStackView演練-點(diǎn)贊

1.stackView添加子視圖

//創(chuàng)建星星

let star = UIImageView(image: UIImage(named: "star"))

//設(shè)置填充模式

star.contentMode = .ScaleAspectFit

//添加到stackView中? 如果希望視圖被其stackView來管理布局,則需要使用addArrangedSubview來添加視圖

starsStackView.addArrangedSubview(star)

//設(shè)置autolayout動(dòng)畫

UIView.animateWithDuration(0.3) { () -> Void in

//對(duì)stackView進(jìn)行立即布局

self.starsStackView.layoutIfNeeded()

}

2.stackView移除子視圖

//取出最后一個(gè)星星

guard let lastStar = starsStackView.subviews.last else {

return

}

//從stackView中移除? removeArrangedSubview只會(huì)使stackView不再管理子視圖的布局,但不是從視圖層級(jí)上移除 想要從視圖層級(jí)上移除需要使用removeFromSuperView

//? ? ? ? starsStackView.removeArrangedSubview(lastStar)

lastStar.removeFromSuperview()

//設(shè)置autolayout動(dòng)畫

UIView.animateWithDuration(0.3) { () -> Void in

//對(duì)stackView進(jìn)行立即布局

self.starsStackView.layoutIfNeeded()

}

#pragma mark - 二. popover

#pragma mark 1. popover基本使用

1.SB中設(shè)置popover

1> 響應(yīng)控件連線目標(biāo)控制器 選擇 Action as popover

2> 設(shè)置Popover的大小

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

//獲取目標(biāo)控制器

let destVC = segue.destinationViewController

//設(shè)置Popover的大小? 當(dāng)控制器為popover的目標(biāo)控制器時(shí),使用preferredContentSize才可以改變Popover的大小

destVC.preferredContentSize = CGSize(width: 200, height: 100)

}

2.來源視圖類型的popover

//Popover根據(jù)產(chǎn)生的控件類型分為兩種: 一種是barButtonItem類型,還有一種非barButtonItem類型,統(tǒng)稱為來源視圖類型,來源視圖類型popover的參考點(diǎn)(箭頭)默認(rèn)在來源視圖的左上角

//修改Popover的參考點(diǎn)

//獲取Popover對(duì)象

let popover = destVC.popoverPresentationController

/*

public var sourceView: UIView? 來源視圖 SB中拖線時(shí)會(huì)自動(dòng)將響應(yīng)控件設(shè)置為來源視圖

public var sourceRect: CGRect 用于設(shè)置參考點(diǎn)? 當(dāng)設(shè)置來源視圖的bounds時(shí),參考點(diǎn)會(huì)設(shè)置在來源視圖的中心點(diǎn)

*/

popover?.sourceRect = (popover?.sourceView?.bounds)!

#pragma mark 2. iPhone實(shí)現(xiàn)popover

//Popover在iPhone上進(jìn)行默認(rèn)的全屏展示,原因iOS系統(tǒng)對(duì)modal展示進(jìn)行了界面自適應(yīng)

//解決辦法: 取消界面自適應(yīng)? 設(shè)置代理

popover?.delegate = self

extension ViewController: UIPopoverPresentationControllerDelegate {

//設(shè)置自適應(yīng)的代理方法不在 UIPopoverPresentationControllerDelegate中,而是在其父協(xié)議? UIAdaptivePresentationControllerDelegate中

//當(dāng)進(jìn)行modal展示的界面自適應(yīng)時(shí)調(diào)用

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{

//取消自適應(yīng)

return .None

}

}

#pragma mark 3. 代碼實(shí)現(xiàn)popover

override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.

//來源視圖類型Popover

let btn = UIButton(type: .ContactAdd)

btn.center = view.center

view.addSubview(btn)

btn.addTarget(self, action: "clickPopover:", forControlEvents: .TouchUpInside)

//barButtonItem類型

let item = UIBarButtonItem(title: "功能", style: .Plain, target: self, action: "clickPopover:")

navigationItem.rightBarButtonItem = item

}

//點(diǎn)擊進(jìn)行Popover

func clickPopover(sender : AnyObject){

//創(chuàng)建目標(biāo)控制器

let vc = UIViewController()

vc.view.backgroundColor = UIColor.redColor()

//設(shè)置modal展示樣式

vc.modalPresentationStyle = .Popover

//代碼設(shè)置Popover需要手動(dòng)設(shè)置來源視圖/barButtonItem? 設(shè)置類型必須在設(shè)置modal展示樣式之后

//獲取popover對(duì)象

let popover = vc.popoverPresentationController

//判斷控件類型

if let btn = sender as? UIButton {

//設(shè)置來源視圖

popover?.sourceView = btn

popover?.sourceRect = btn.bounds

} else if let item = sender as? UIBarButtonItem {

//設(shè)置barButtonItem

popover?.barButtonItem = item

}

//進(jìn)行modal展示

presentViewController(vc, animated: true, completion: nil)

}

#pragma mark 4. popover的其他用法

1.設(shè)置忽略外部點(diǎn)擊

vc.modalInPopover = true

2.設(shè)置可穿透視圖? 在Popover打開的情況下,可以響應(yīng)其他控件的事件

popover?.passthroughViews = [testBtn]

#pragma mark - 三. iPad-modal展示

#pragma mark 1. Modal簡(jiǎn)介和unwind介紹

1.iPad中的展示樣式:

1> FullScreen 默認(rèn)展示樣式 全屏展示

2> FormSheet iPad中最常用的modal展示效果? 在屏幕中心顯示小窗體

3> PageSheet 幾乎占滿全屏,使用較少 場(chǎng)景: 顯示用戶權(quán)益/法律法規(guī)

4> CurrentContext 在當(dāng)前控制器的界面范圍中展示以原控制器同樣的方式進(jìn)行展示

5> Over CurrentContext 當(dāng)前控制器視圖如果是半透明的,則可以透出前一個(gè)控制器的界面內(nèi)容

2.Unwind Segue 解除跳轉(zhuǎn)? iOS7

1> 可以在SB中實(shí)現(xiàn)界面的返回 可以用在modal&push中

2> 想要使用unwind Segue,必須設(shè)置segue的響應(yīng)方法

//segue響應(yīng)方法必須滿足兩個(gè)條件: 1> 必須含有@IBAction關(guān)鍵字 用于進(jìn)行關(guān)聯(lián)? 2> 參數(shù)必須傳遞 segue本身? 用于傳值

@IBAction func back(segue : UIStoryboardSegue){

}

3> Unwind Segue可以實(shí)現(xiàn)跨控制器的解除跳轉(zhuǎn)

#pragma mark 2. FromSheet&PageSheet

#pragma mark 3. CurrentContext展現(xiàn)和跨控制器解除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芝雪,隨后出現(xiàn)的幾起案子钩杰,更是在濱河造成了極大的恐慌磕蛇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆甜,死亡現(xiàn)場(chǎng)離奇詭異圆丹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)李请,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厉熟,“玉大人导盅,你說我怎么就攤上這事∽嵘” “怎么了白翻?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)月培。 經(jīng)常有香客問我嘁字,道長(zhǎng)恩急,這世上最難降的妖魔是什么杉畜? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衷恭,結(jié)果婚禮上此叠,老公的妹妹穿的比我還像新娘。我一直安慰自己随珠,他們只是感情好灭袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窗看,像睡著了一般茸歧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上显沈,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天软瞎,我揣著相機(jī)與錄音逢唤,去河邊找鬼。 笑死涤浇,一個(gè)胖子當(dāng)著我的面吹牛鳖藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只锭,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼著恩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蜻展?” 一聲冷哼從身側(cè)響起喉誊,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纵顾,沒想到半個(gè)月后裹驰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡片挂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幻林,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片音念。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沪饺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闷愤,到底是詐尸還是另有隱情整葡,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布讥脐,位于F島的核電站遭居,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旬渠。R本人自食惡果不足惜俱萍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望告丢。 院中可真熱鬧枪蘑,春花似錦、人聲如沸岖免。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颅湘。三九已至话侧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闯参,已是汗流浹背瞻鹏。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工术羔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乙漓。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓级历,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叭披。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寥殖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容