【Swift】UIPresentationController的使用方法
UIPresentationController是ios8.0的新特性哦,使用需要注意
先上一个效果图

第一步: 连线选择segue类型为,present Modally
第二步:需要演示的控制器,自定义为HJCPopViewController
第三步:新建一个类HJCPopoverPresentationController,继承UIPresentationController
第四步:在HJCPopoverPresentationController类中实现以下代码
// 遮罩视图
lazy var dummyView: UIView = { let v = UIView()
v.backgroundColor = UIColor(white: 0.0, alpha: 0.2) // 添加手势识别,可以隔离所有底层控件
let tap = UITapGestureRecognizer(target: self, action: "clickDummyView")
v.addGestureRecognizer(tap) return v
}() func clickDummyView() {
// 关闭被 Modal 的视图控制器
self.presentedViewController.dismissViewControllerAnimated(true, completion: nil)
} /**
presentedViewController: 要 modal 显示的视图控制器
presentingViewController: 文档说,底层的视图控制器,但是实测是nil containerView 容器视图,构造函数中,是 nil,符合懒加载的原则
presentedView() 被展现的视图
containerViewWillLayoutSubviews 将要布局子视图,自定义 presentedView 的大小和位置
*/
override func containerViewWillLayoutSubviews() {
super.containerViewWillLayoutSubviews() // // 设置遮罩视图的大小
// dummyView.frame = containerView.bounds
// containerView.insertSubview(dummyView, atIndex: 0) // 设置目标视图的大小
presentedView().frame = CGRectMake(100, 56, 200, 240)
}
第五步:在主控制器中设置目标 跳转控制器相关属性
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let popVC = segue.destinationViewController as! HJCPopoverPresentationController
/**
要实现自定义Modal转场
1. 设置转场代理
返回 UIPresentationController,由 该控制器,负责 Modal 界面的处理
2. 指定Modal的展现方式是自定义
*/
// transition 转场,从一个界面跳到另外一个界面
popVC.transitioningDelegate = self
// 设置展现方式
popVC.modalPresentationStyle = UIModalPresentationStyle.Custom
}
第六步, 主控制器中加一个变量
// // 是否正在展现的标记
var isPresentation = false
第七步,实现主控制器中实现下面的代码
/// 视图控制器转场代理
extension HomeTableViewController: UIViewControllerTransitioningDelegate,UIViewControllerAnimatedTransitioning{ /// 返回控制 Modal 管理的控制器
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? { return HJCPopoverPresentationController(presentedViewController: presented, presentingViewController: presenting)
} /// 返回提供 Modal 展现动画对象
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { // Modal
isPresentation = true return self
} /// 返回提供 Dismiss 动画的对象
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { // Dismiss
isPresentation = false return self
} // MARK: - UIViewControllerAnimatedTransitioning
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 0.5
} /**
transitionContext 转场上下文,提供转场动画的相关信息
从哪里来,到哪里去 主动提供转场的动画,一旦实现了这个方法,原有的转场动画会失效->目标控制器看不到了
*/
func animateTransition(transitionContext: UIViewControllerContextTransitioning) { // 将 toVC 的 view 添加到容器视图
if isPresentation {
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! // 将目标视图添加到容器视图
transitionContext.containerView().addSubview(toView) // 动画方法
// 设置动画初始的形变
toView.transform = CGAffineTransformMakeScale(1.0, 0)
// 设置图层的锚点
toView.layer.anchorPoint = CGPointMake(0.5, 0) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 5.0, options: nil, animations: { () -> Void in toView.transform = CGAffineTransformMakeScale(1.0, 1.0) }, completion: { (_) -> Void in
transitionContext.completeTransition(true)
})
} else {
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! // 将 Modal 出来的视图 从容器视图中删除
fromView.removeFromSuperview() // 动画完成
// *** 一定必须要执行的函数,告诉系统转场动画结束了
transitionContext.completeTransition(true)
}
}
【Swift】UIPresentationController的使用方法的更多相关文章
- 【Swift学习】Swift编程之旅---方法(十五)
在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...
- Swift编程语言中的方法引用
由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...
- Swift中自定义打印方法
// 1.获取打印所在的文件 let file = ( #file as NSString).lastPathComponent // 2.获取打印所在的方法 let funcName = #func ...
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...
- Swift下表和方法
本文将同时阐述Swift的方法和下标,因为根据我的理解,从某种程度上讲,下标的本质也是方法. 方法 众所周知,在支持面向对象的语言里,方法一般分为两种:实例方法和类方法(在有的语言中,「类方法」被称为 ...
- Swift语言之类型方法
Swift语言有很多特性,其中之一就是类型方法,相对于其他比较流行的编程语言(C#.Java),在Swift中类型方法最大的特征在于它的可继承性,我们举个例子说明: 俗话说,龙生龙凤生凤老鼠生儿会打洞 ...
- Swift - AppDelegate.swift类中默认方法的介绍
项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行 这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法. ...
- Swift的属性,方法,下标脚本以及继承
从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并非太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于非常好的应用Swift语言将会有比較大的帮助. 属性 存储属性 ...
- swift网络数据请求方法
搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 <?php // header("Content-type:text/html;charset=utf-8&qu ...
随机推荐
- .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收
各种语言的垃圾回收在IT界噪的沸沸扬扬,有极大的优化同时也有瓶颈. 而在.Net中的垃圾回收机制又是怎样的呢? 众所知周,.Net中的垃圾回收机制是由.Net Framework托管的,带给开发者最大 ...
- linux小白成长之路8————访问Docker中的mysql
[内容指引] 本篇实战演示如何操作Docker中的mysql数据库,包含以下五个知识点: 登录容器: 登录mysql: 运行SQL指令创建数据库: 退出mysql: 退出容器: 1.登录容器 我们在上 ...
- DevOps实践之Gitlab安装部署
All GitLab packages are posted to our package server and can be downloaded. We maintain five repos: ...
- css3图片模糊过滤特效
体验效果:点击这里查看效果 代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- WHCTF-babyre
WHCTF-babyre 首先执行file命令得到如下信息 ELF 64-bit LSB executable, x86-64 尝试用IDA64打开,定位到关键函数main发现无法F5,尝试了修复无果 ...
- pjax实例demo(c#,iis)
pjax 百度都是api 也没找到demo 自己写了一个 C#写的 需要iis架设 测试ie10 和 火狐 成功 ie10不要用兼容模式 不然不好使 iis 可以直接架设webDemo1文件夹(源码) ...
- SQLAlchemy 教程 —— 基础入门篇
SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...
- 冲刺NO.8
Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行,项目的基础部分如基本信息管理,信用信息管理等部分已相对比较完善. 问题困难 技术困难在短期内很难发生质的变化,而本项目由于选择了队员不太熟悉的 ...
- 用anaconda安装最新的TensorFlow版本
Google发布了TensorFlow1.4正式版 在anaconad搜索依旧是1.2的版本,通过一番查阅,找到了方法 1,打开anaconda-prompt 2,激活你要安装的环境 activate ...
- 从一个事件绑定说起 - DOM
事件绑定的方式 给 DOM 元素绑定事件分为两大类:在 html 中直接绑定 和 在 JavaScript 中绑定. Bind in HTML 在 HTML 中绑定事件叫做内联绑定事件,HTML 的元 ...