【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 ...
随机推荐
- Git常用命令(二)------ 远程库操作
本文总结自廖雪峰网站. Git支持多种协议,git://使用ssh协议,速度最快,也可使用https等协议. 对远程库操作: 推送: 1.先远程建立一个Repo库,f 2.远程和本地关联: git r ...
- Sublime Text3下使用Python,REPL的安装与快捷键设置方法
前提条件:连接外网 1.安装管理插件(CTRL+SHIFT+P),找到Package Control:install package一项,回车后继续选择SublimeREPL插件,进行安装: ...
- 记录python接口自动化测试--主函数(第六目)
把操作excel的方法封装好后,就可以用准备好的接口用例来循环遍历了 我的接口测试用例如下 主函数代码: run_handle_excel.py# coding:utf-8 from base.run ...
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res
解决:web项目出现如上问题,据查是版本问题: JSTL 1.0 的声明是: <%@ taglib prefix="c" uri="http://java.sun. ...
- exports
暴露函数 var bar = require("./bar.js"); var msg = "你好"; var info = "呵呵"; f ...
- 去掉xcode编译warning:ld: warning: directory not found for option '-L
选择工程, 编译的 (targets) 选择 Build Settings 菜单 查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warn ...
- JAVA_SE基础——61.字符串入门
public class Demo1 { public static void main(String[] args) { String str1 = "hello"; Strin ...
- 改变this不要怕!!!
在之前的学习和工作中,会不必要的涉及到 改变this的指向问题: 脑子里会想到的是 apply, call, bind 这三个 可逆知道他的区别吗? 1. bind区别于 apply和call 是因为 ...
- angular4学习笔记整理(二)angular4的路由使用
这章说一下angular的路由 先说angular路由怎么引入,一开始new出来的angular项目它路由帮你配好了,但看要看app.module.ts里面 1.首先最上面要引入路由模块 import ...
- Go语言的核心Routine-Channel
前言 Go语言通过routine,提供了并发编程的支持. Routine特性 (1) goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的. 例:启动一 ...