【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 ...
随机推荐
- Vim编辑器的注释,解注,删除与恢复
1. 注释: 将光标移动到注释首部 命令模式下 Ctrl+V,进入列模式 上下移动,选中待注释内容 按大写I,进入插入模式 输入 // or # 按两次退出 2 解注 将光标移动到待解注首部 命令模式 ...
- [BZOJ 1079][SCOI 2008]着色方案
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2237 Solved: 1361[Submit][Stat ...
- JavaScript(第十八天)【DOM基础】
学习要点: 1.DOM介绍 2.查找元素 3.DOM节点 4.节点操作 DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口).DOM描绘 ...
- 2018上C语言程序设计(高级)作业- 初步计划
C语言程序设计(高级)36学时,每周4学时,共9周.主要学习指针.结构和文件三部分内容.整个课程作业计划如下: PTA和博客的使用指南 若第一次使用PTA和博客,请务必先把PTA的使用简介和教师如何在 ...
- Week02-Java基本语法与类库
1. 本周学习总结 本周主要学习了包装类,明白了包装类比基本数据类型的优点(见书面作业4.2),了解了自动装箱,自动拆箱的概念和区别(见书面作业4.1),知道了java中的引用类似C语言中的指针,明白 ...
- Bate敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- CPP链表示例
#include<iostream> #include<stdlib.h> using namespace std; typedef struct Student_data { ...
- Django 视图层
URL映射 1.分布式url映射 include()函数提供分布式url映射功能,使URL映射可以被编写在多个url.py文件中 from django.conf.urls import url fr ...
- Tornado websocket应用
应用场景 WebSocket 的特点如下 适合服务器主动推送的场景(好友上线,即时聊天信息,火灾警告,股票涨停等) 相对于Ajax和Long poll等轮询技术,它更高效,不耗费网络带宽和计算资源 它 ...
- android头像选择(拍照,相册,裁剪)
组织头像上传时候,不兼容android6.0,并且 imageview.setImageBitmap(BitmapFactory.decodeFile(IMAGE_FILE_LOCATION));// ...