您的位置:首页 > 移动开发 > Swift

【Swift】UIPresentationController的使用方法

2015-05-14 20:18 507 查看
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)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: