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)和跨控制器解除