I think, uiviewcontroller.transitioningDelegate is the way to do it on iOS7 ans 8 : 
//Mark : Custom Transitionning for modal
func presentViewController(viewControllerToPresent: UIViewController, animated flag: Bool, fromRight:Bool , completion: (() -> Void)?) {
    if fromRight
    {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationStyle.FullScreen
        viewControllerToPresent.transitioningDelegate = self;
        self.presentViewController(viewControllerToPresent, animated: true, completion: completion);
    }
    else
    {
        self.presentViewController(viewControllerToPresent, animated: true, completion: completion)
    }
}
//MARK : Transitioning Delegate
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return self;
}
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return self;
}
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
    return 0.4;
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    let toView = toViewController.viewForTransitionContext(transitionContext)
    let fromView = fromViewController.viewForTransitionContext(transitionContext)
    let containerView = transitionContext.containerView()
    let duration = self.transitionDuration(transitionContext);
    let initialFrame = transitionContext.initialFrameForViewController(fromViewController)
    var offsetRect = initialFrame
    offsetRect.origin.x += CGRectGetWidth(initialFrame);
    //Present
    if toViewController.isBeingPresented()
    {
        // init state before animation
        toView.frame = offsetRect;
        containerView.addSubview(toView);
        // then animate
        UIView.animateWithDuration(duration, animations: { () -> Void in
            toView.frame = initialFrame;
            }, completion: { (finished) -> Void in
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        })
    }
    //Dismiss
    else
    {
        // init state before animation
        containerView.addSubview(toView)
        containerView.sendSubviewToBack(toView)
        // then animate
        UIView.animateWithDuration(duration, animations: { () -> Void in
            fromView.frame = offsetRect
            }, completion: { (finished) -> Void in
                fromView.removeFromSuperview()
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        })
    }
}