import UIKit
//点击此页面的按钮 然后modal出一个新页面
class HomeTableViewController: BasicViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet weak var button: UIButton!
//定义一个bool类型来记录是present还是dimiss
var isPresented = false
//必须重写下面这个方法
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "123" {
let vc = segue.destinationViewController as! PopViewController
//设置转场代理
vc.transitioningDelegate = self
//设置桩长类型为自定义
vc.modalPresentationStyle = UIModalPresentationStyle.Custom
}
}
}
//试图控制器转场代理 和动画属性相关
extension HomeTableViewController: UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {
//返回控制modal管理的控制器
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? {
return PopViewPresentationController(presentedViewController: presented, presentingViewController: presenting)
}
//返回modal展现的动画对象
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//这个方法返回的对象是进行modal转场控制的 所以状态要设置为true
isPresented = true
return self
}
//返回退出的动画对象
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
isPresented = false
return self
}
//返回专场动画时间
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 0.5
}
//主动提供转场的动画,一旦实现了这个方法,原有的专场动画会失效 transitionContext 转场上下文 提供专场动画的相关消息
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
if isPresented {
//得到toView
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)
//将toview添加到容器视图
transitionContext.containerView().addSubview(toView!)
//动画方法
//设置动画的形变
toView?.transform = CGAffineTransformMakeScale(1, 0)
//设置锚点
toView?.layer.anchorPoint = CGPointMake(0.5, 0)
//设置动画
UIView.animateWithDuration(1, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 10, options: nil, animations: { () -> Void in
toView?.transform = CGAffineTransformMakeScale(1, 1)
}){ (_) in
//动画完成一定要执行的函数,告诉系统动画结束了
transitionContext.completeTransition(true)
}
} else {
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
fromView?.removeFromSuperview()
transitionContext.completeTransition(true)
}
}
}
import UIKit
//撞门负责modal的控制器
class PopViewPresentationController: UIPresentationController {
//需要重写这个方法
override init(presentedViewController: UIViewController!, presentingViewController: UIViewController!) {
super.init(presentedViewController: presentedViewController, presentingViewController: presentingViewController)
}
//对要对modal出来的view进行布局
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
//设置遮罩试图的大小
dummyView.frame = self.containerView.frame
containerView.insertSubview(dummyView, atIndex: 0)
presentedView().frame = CGRectMake(100, 56, 200, 240)
}
//添加遮罩试图
lazy var dummyView: UIView = {
let v = UIView()
v.backgroundColor = UIColor(white: 0, alpha: 0.3)
//添加手势识别
let tap = UITapGestureRecognizer(target: self, action: "clickDummyView")
v.addGestureRecognizer(tap)
return v
}()
//点击退出modal
func clickDummyView() {
self.presentedViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
import UIKit
//要呗modal出来的控制器
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}