自定义ViewController转换不能正确resize

我有我的应用程序中的导航控制器的自定义Viewcontroller转换。 在执行转换时,它没有正确调整子视图控制器的内容。 默认的转换不会调整它的大小。 我在Github上添加了一个示例项目来演示这个问题。

embedded在导航控制器中的VC

import UIKit class PopoverVCViewController: UIViewController, UIViewControllerTransitioningDelegate, UINavigationControllerDelegate { let animator = Animator() override func viewDidLoad() { super.viewDidLoad() navigationController?.delegate = self // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { animator.reverse = operation == .Pop return animator } } 

animation师

 class Animator: NSObject, UIViewControllerAnimatedTransitioning { var reverse: Bool = false func animateTransition(transitionContext: UIViewControllerContextTransitioning) { // get reference to our fromView, toView and the container view that we should perform the transition in let container = transitionContext.containerView()! let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! // set up from 2D transforms that we'll use in the animation let offScreenRight = CGAffineTransformMakeTranslation(container.frame.width, 0) let offScreenLeft = CGAffineTransformMakeTranslation(-container.frame.width, 0) // start the toView to the right of the screen if (self.reverse == false) { toView.transform = offScreenRight } else { toView.transform = offScreenLeft } // add the both views to our view controller container.addSubview(toView) container.addSubview(fromView) // get the duration of the animation // DON'T just type '0.5s' -- the reason why won't make sense until the next post // but for now it's important to just follow this approach let duration = self.transitionDuration(transitionContext) // perform the animation! // for this example, just slid both fromView and toView to the left at the same time // meaning fromView is pushed off the screen and toView slides into view // we also use the block animation usingSpringWithDamping for a little bounce UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { if (self.reverse == false) { fromView.transform = offScreenLeft } else { fromView.transform = offScreenRight } toView.transform = CGAffineTransformIdentity }, completion: { finished in // tell our transitionContext object that we've finished animating transitionContext.completeTransition(true) }) } // return how many seconds the transiton animation will take func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return 0.3 } // MARK: UIViewControllerTransitioningDelegate protocol methods // return the animataor when presenting a viewcontroller // remmeber that an animator (or animation controller) is any object that aheres to the UIViewControllerAnimatedTransitioning protocol func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return self } // return the animator used when dismissing from a viewcontroller func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return self } } 

您可以设置toView的框架以匹配toView的高度和宽度:

 let container = transitionContext.containerView()! let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! toView.frame = CGRectMake(toView.frame.origin.x, toView.frame.origin.y, fromView.frame.width, fromView.frame.height) 

或者像这样:

 UIViewController* toController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIViewController* fromController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 

然后在你的animation程序结束时设置它:

toController.view.frame=fromController.view.frame;