1.項目可以通過設置Device來選擇部署的平臺
1> 選擇iPhone(說明項目是用于在iPhone上展示的),該項目可以在iPad上運行,但是界面邊緣有黑邊,用戶體驗較差
2> 選擇iPad(說明項目是用于在iPad上展示的),該項目不可以在iPhone上運行,體現在AppStore上,下載的APP不能安裝在iPhone上
3> 選擇Universal,該項目既可以在iPhone也可以在iPad上運行
#pragma mark - 一. UIStackView
#pragma mark 1. UIStackView介紹
概念: 一個用于堆疊視圖的容器? iOS9的API
用途: StackView及其子視圖可以進行界面自適應,主要用于"減少"設置約束的工作量
特點:
1> 類似containerView,不能在界面上進行渲染
2> stackView中的子視圖只能朝一個方向進行排列? 要么水平要么豎直
3> stackview可以進行嵌套
4> stackView自適應的優先級要低于手動設置約束(使用stackView后不能再通過frame來改變尺寸),可以通過設置約束來調整stackView進行的自適應處理
5> stackView支持屬性動畫
6> stackView不支持滾動
#pragma mark 2. UIStackView基本布局
Axis : 軸 用于設置子視圖的排列方向? 水平/豎直
Aligment : 對齊 用于設置子視圖的對齊方式
Distribution : 分布 用于設置子視圖的分布(排列方向上的填充)方式
Spacing: 設置子視圖之間的間距
#pragma mark 3. UIStackView分屏適配(Sizeclass)
1.iPad的分屏技術? iOS9的API
1> 可以讓iPad前臺同時有兩個APP運行 實現真正的多任務處理
2> 硬件要求 必須在iPad Air2及以上
3> Xcode Bug: 如果項目一開始選擇的不是Universal,則修改成Universal以后也無法支持iPad分屏
2.iPad分屏適配
1> 分屏界面展示原則: iPad分屏時,會按照iPhone豎屏的展示樣式(對應的SizeClass)進行展示
2> 抗壓優先級: 當控件進行布局時,如果空間產生競爭關系,則抗壓優先級越高,抗擠壓能力越強,空間競爭時,就會先擠壓其他優先級低的控件? 默認750
3> 設置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.
}
//點擊切換大圖
@IBAction func clickShowImgBtn(sender: UIButton) {
//獲取圖片
let img = UIImage(named: "skirts_0\(sender.tag)")
//展示大圖
showImgV.image = img
//動畫漸變
showImgV.alpha = 0.5
UIView.animateWithDuration(0.3) { () -> Void in
self.showImgV.alpha = 1.0
}
}
//將底部stackView以動畫的形式改成豎向排列
@IBAction func clickAddStarBtn(sender: AnyObject) {
UIView.animateWithDuration(0.3) { () -> Void in
self.bottomStackView.axis = .Vertical
}
}
//將底部stackView以動畫的形式改成橫向排列
@IBAction func clickBuyBtn(sender: AnyObject) {
UIView.animateWithDuration(0.3) { () -> Void in
self.bottomStackView.axis = .Horizontal
}
}
}
#pragma mark 4. UIStackView演練-點贊
1.stackView添加子視圖
//創建星星
let star = UIImageView(image: UIImage(named: "star"))
//設置填充模式
star.contentMode = .ScaleAspectFit
//添加到stackView中? 如果希望視圖被其stackView來管理布局,則需要使用addArrangedSubview來添加視圖
starsStackView.addArrangedSubview(star)
//設置autolayout動畫
UIView.animateWithDuration(0.3) { () -> Void in
//對stackView進行立即布局
self.starsStackView.layoutIfNeeded()
}
2.stackView移除子視圖
//取出最后一個星星
guard let lastStar = starsStackView.subviews.last else {
return
}
//從stackView中移除? removeArrangedSubview只會使stackView不再管理子視圖的布局,但不是從視圖層級上移除 想要從視圖層級上移除需要使用removeFromSuperView
//? ? ? ? starsStackView.removeArrangedSubview(lastStar)
lastStar.removeFromSuperview()
//設置autolayout動畫
UIView.animateWithDuration(0.3) { () -> Void in
//對stackView進行立即布局
self.starsStackView.layoutIfNeeded()
}
#pragma mark - 二. popover
#pragma mark 1. popover基本使用
1.SB中設置popover
1> 響應控件連線目標控制器 選擇 Action as popover
2> 設置Popover的大小
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//獲取目標控制器
let destVC = segue.destinationViewController
//設置Popover的大小? 當控制器為popover的目標控制器時,使用preferredContentSize才可以改變Popover的大小
destVC.preferredContentSize = CGSize(width: 200, height: 100)
}
2.來源視圖類型的popover
//Popover根據產生的控件類型分為兩種: 一種是barButtonItem類型,還有一種非barButtonItem類型,統稱為來源視圖類型,來源視圖類型popover的參考點(箭頭)默認在來源視圖的左上角
//修改Popover的參考點
//獲取Popover對象
let popover = destVC.popoverPresentationController
/*
public var sourceView: UIView? 來源視圖 SB中拖線時會自動將響應控件設置為來源視圖
public var sourceRect: CGRect 用于設置參考點? 當設置來源視圖的bounds時,參考點會設置在來源視圖的中心點
*/
popover?.sourceRect = (popover?.sourceView?.bounds)!
#pragma mark 2. iPhone實現popover
//Popover在iPhone上進行默認的全屏展示,原因iOS系統對modal展示進行了界面自適應
//解決辦法: 取消界面自適應? 設置代理
popover?.delegate = self
extension ViewController: UIPopoverPresentationControllerDelegate {
//設置自適應的代理方法不在 UIPopoverPresentationControllerDelegate中,而是在其父協議? UIAdaptivePresentationControllerDelegate中
//當進行modal展示的界面自適應時調用
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{
//取消自適應
return .None
}
}
#pragma mark 3. 代碼實現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
}
//點擊進行Popover
func clickPopover(sender : AnyObject){
//創建目標控制器
let vc = UIViewController()
vc.view.backgroundColor = UIColor.redColor()
//設置modal展示樣式
vc.modalPresentationStyle = .Popover
//代碼設置Popover需要手動設置來源視圖/barButtonItem? 設置類型必須在設置modal展示樣式之后
//獲取popover對象
let popover = vc.popoverPresentationController
//判斷控件類型
if let btn = sender as? UIButton {
//設置來源視圖
popover?.sourceView = btn
popover?.sourceRect = btn.bounds
} else if let item = sender as? UIBarButtonItem {
//設置barButtonItem
popover?.barButtonItem = item
}
//進行modal展示
presentViewController(vc, animated: true, completion: nil)
}
#pragma mark 4. popover的其他用法
1.設置忽略外部點擊
vc.modalInPopover = true
2.設置可穿透視圖? 在Popover打開的情況下,可以響應其他控件的事件
popover?.passthroughViews = [testBtn]
#pragma mark - 三. iPad-modal展示
#pragma mark 1. Modal簡介和unwind介紹
1.iPad中的展示樣式:
1> FullScreen 默認展示樣式 全屏展示
2> FormSheet iPad中最常用的modal展示效果? 在屏幕中心顯示小窗體
3> PageSheet 幾乎占滿全屏,使用較少 場景: 顯示用戶權益/法律法規
4> CurrentContext 在當前控制器的界面范圍中展示以原控制器同樣的方式進行展示
5> Over CurrentContext 當前控制器視圖如果是半透明的,則可以透出前一個控制器的界面內容
2.Unwind Segue 解除跳轉? iOS7
1> 可以在SB中實現界面的返回 可以用在modal&push中
2> 想要使用unwind Segue,必須設置segue的響應方法
//segue響應方法必須滿足兩個條件: 1> 必須含有@IBAction關鍵字 用于進行關聯? 2> 參數必須傳遞 segue本身? 用于傳值
@IBAction func back(segue : UIStoryboardSegue){
}
3> Unwind Segue可以實現跨控制器的解除跳轉
#pragma mark 2. FromSheet&PageSheet
#pragma mark 3. CurrentContext展現和跨控制器解除