ios開發之IPAD布局問題

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容