Popover跳转
1.1-简介
什么是Popover?
- UIViewController进行跳转的时候,可以设置跳转样式
- Popover样式是iOS8加入的新特性
- UIViewController进行跳转的时候,可以设置跳转样式
1.2-在StoryBoard中使用Popover
- 1.创建目标控制器
- 2.连线控制器,选择present as popover
- 3.设置popover大小
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//segue跳转
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//获取目标控制器
let desVC = segue.destinationViewController
//获取目标控制器的popover对象
let popover = desVC.popoverPresentationController
//适配iPhone iOS会根据设备类型选择不同的Model展示效果,如果希望iPhone上面展示popover效果 则需要通过设置代理取消系统的自适应
popover?.delegate = self
if segue.identifier == "function"
{
//设置popover的大小 当控制器为popover的目标控制器时,使用preferredContentSize可以设置popover的大小
desVC.preferredContentSize = CGSizeMake(100, 100)
}
else if segue.identifier == "group"
{
//按照跳转popover的交互控件分类,主要由两种,一种是UIBarButtonItem,一种是非UIBarButtonItem,统称为来源视图,popover的参考点会默认设置在来源视图的左上角
//修改popover参考点的位置 默认是来源视图的左上角 设置bounds为参考点时 则会将来源视图的中心点设置为参考点
popover?.sourceRect = (popover?.sourceView?.bounds)!
}
}
}
extension ViewController:UIPopoverPresentationControllerDelegate
{
//当设置Model展示的自适应效果时会调用
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
//不进行自适应
return UIModalPresentationStyle.None
}
// //如果iPhone上面 不取消自适应 也可以手动给popover添加一个导航栏 按钮来实现取消跳转
// func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
// let nv = UINavigationController.init(rootViewController: controller.presentedViewController)
// let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss:")
//
// nv.topViewController!.navigationItem.rightBarButtonItem = btnDone
//
// return nv
// }
//
// func dismiss(btn:UIButton)
// {
//
// print(btn.nextResponder()?.nextResponder()?.nextResponder())
// //该用法慎用~ 你懂得…… (逼格太高,一般人看不懂,不符合项目编码规范)
// //原理是 UIButton和UIViewController都是继承于UIResponder 利用响应链通过UIButton找到其所在的UINavigationController
// let nv = btn.nextResponder()?.nextResponder()?.nextResponder() as? UINavigationController
// nv?.dismissViewControllerAnimated(true, completion: { () -> Void in
//
// })
// }
}
1.3-总结
当控制器model跳转样式为popover样式时,可以通过目标控制器的popoverPresentationController获取对应的UIPopoverPresentationController对象
popover样式进行跳转的时候,iPad样式和iPhone样式区别
- iPad下默认是弹窗形式,且代码无法更改
- iPhone下默认是全屏显示,并且不会自带消失按钮
- 第一种解决方案:实现UIPopoverPresentationControllerDelegate,取消自适应
- 第二种解决方案:实现UIPopoverPresentationControllerDelegate,采用UINavigationController替换原有Controller,手动添加消失按钮
popover常用属性有两个,SourceView和SourceRect
- SourceView:来源视图,Storyboard跳转默认的是连线的那一个视图,代码跳转需要手动指定
- SourceRect:目标参考点,根据来源视图的种类分为两种,UIBarButtonItem和非UIBarButtonItem。
- 非UIBarButtonItem:默认在来源视图的左上角,当使用来源视图的bounds为参考点时,则会将来源视图的中心点设置为参考点
- UIBarButtonItem:系统自动适应,设置无效
popover箭头方向可以通过设置permittedArrowDirections属性更改
- 默认为Unknow(系统自动判断)