【Swift】UIPresentationController的使用方法
2015-05-14 20:18
507 查看
UIPresentationController是ios8.0的新特性哦,使用需要注意
先上一个效果图
第一步: 连线选择segue类型为,present Modally
第二步:需要演示的控制器,自定义为HJCPopViewController
第三步:新建一个类HJCPopoverPresentationController,继承UIPresentationController
第四步:在HJCPopoverPresentationController类中实现以下代码
第五步:在主控制器中设置目标 跳转控制器相关属性
第六步, 主控制器中加一个变量
第七步,实现主控制器中实现下面的代码
先上一个效果图
第一步: 连线选择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开发IOS项目、UI创建、方法调用
- 使用Swift开发iOS项目、UI创建、方法调用
- UISplitViewController基本使用方法
- Swift 中UITabBarController使用方法
- swift常用UI控件的使用方法
- iOS开发 -UISearchController的使用和改善方法
- Swift3-UISearchController的基本使用
- swift方法 的写法,ui上拖拽的控件到controller里面的方法
- swift开发之--UISearchBar的使用/UISearchController的使用
- Swift新手教程系列5-函数+selector在swift中的使用方法
- iOS 使用 UIMenuController 且不隐藏键盘的方法
- swift项目中使用oc框架不提示方法的解决办法
- iOS强制使用系统键盘的方法(Swift)
- dui UIDesigner代码问题修改与使用方法
- swift 字符串String的使用方法
- 关于springmvc 中的Controller使用自动装配失败的解决方法
- iOS UI代码片段-UIPageViewController的使用
- 【swift】使用tabbarController出现的问题
- 关于ndk开发使用jni回掉java方法更新UI的问题
- swift3.0之UIImagePickerController的使用和注意事项