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