自定义转场动画

实现思路

自定义转场动画时需要做以下几步
以下内容假设是从A–>B添加的segue

  • 添加两个segue(一个是用于正向转场 ,一个是新页面推出时的反向转场动画)
  • 从原view向目标view右键拖动 这是segue的可选项中就会有新添加的两个segue 选择正向的那个转场,也可以选择custom 然后设置segue对应的class
  • 反向转场相对就要麻烦些了 反向转场是B–>A 首先在A中重写返回A时调用的方法(不是B中)方法中设置转场调用的动画

详细实现

正向转场的实现类

//
//  PushSegue.swift
//  signDemo
//
//  Created by PSVMC on 15/6/9.
//  Copyright (c) 2015年 PSVMC. All rights reserved.
//

import UIKit

class CustomPushSegue: UIStoryboardSegue {

    override func perform() {
        //原视图
        var source = self.sourceViewController as! UIViewController;
        //目标视图
        var destination = self.destinationViewController as! UIViewController;

        source.view.addSubview(destination.view);
        destination.view.frame=source.view.frame;

        destination.view.frame.origin.x+=320;
        //destination.view.transform=CGAffineTransformMakeScale(0.1, 0.1)


        source.view.alpha=CGFloat(1.0)
        destination.view.alpha=CGFloat(1.0);

        UIView.animateKeyframesWithDuration(0.3, delay: 0, options: UIViewKeyframeAnimationOptions.CalculationModeCubic, animations: {
            source.view.frame.origin.x-=320;
            destination.view.alpha=1.0;
            destination.view.transform=CGAffineTransformMakeScale(1.0, 1.0)
            //destination.view.frame.origin.x-=320;
            }, completion:{(finish) -> Void in
                source.presentViewController(destination, animated: false, completion: nil)
            }
        )
    }
}

反向转场的实现类

//
//  CustomPushUnwindSegue.swift
//  signDemo
//
//  Created by PSVMC on 15/6/9.
//  Copyright (c) 2015年 PSVMC. All rights reserved.
//

import UIKit

class CustomPushUnwindSegue: UIStoryboardSegue {
    override func perform() {
        var source = self.sourceViewController as! UIViewController;
        var destination = self.destinationViewController as! UIViewController;

        let window = UIApplication.sharedApplication().keyWindow
        window?.insertSubview(destination.view, aboveSubview: source.view)

        destination.view.frame=source.view.frame;

        destination.view.bounds.origin.x-=320;
        //destination.view.transform=CGAffineTransformMakeScale(0.1, 0.1)
        //bounds是绝对位置
        //frame是相对父元素的位置


        //source.view.bounds.origin.x-=320;
        source.view.alpha=CGFloat(1.0)
        destination.view.alpha=CGFloat(1.0);

        UIView.animateKeyframesWithDuration(0.3, delay: 0, options: UIViewKeyframeAnimationOptions.CalculationModeCubic, animations: {

            source.view.bounds.origin.x+=320;
            destination.view.bounds.origin.x+=320;
            destination.view.alpha=1.0;
            destination.view.transform=CGAffineTransformMakeScale(1.0, 1.0)
            //destination.view.frame.origin.x-=320;
            }, completion:{(finish) -> Void in
                source.dismissViewControllerAnimated(false, completion: nil);
            }
        )

    }
}

重写反向转场的动画

override func segueForUnwindingToViewController(toViewController: UIViewController, fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue {
    if let id = identifier{
        if id == "unwindToLogin" {
            let unwindSegue = CustomPushUnwindSegue(identifier: id, source: fromViewController, destination: toViewController, performHandler: { () -> Void in

            })
            return unwindSegue
        }
    }

    return super.segueForUnwindingToViewController(toViewController, fromViewController: fromViewController, identifier: identifier)
}