私が思うに、uiviewcontroller.transitioningDelegateは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())
})
}
}
、ビューは、右下の隅から来ています。しかし、私はナビゲーションコントローラのそれと同様のものを持っていたい。 (しかし私は私のアプリでナビゲーションコントローラを持っていませんし、それを実装したくありません) – Satyam
私にとっては右から左に表示されますが、白い背景にはまだあります:-( –
私はこのテクニックを ' MFMailComposeViewController'を実行していましたが、ある時点、おそらくiOS6では正常に動作しなくなりました。シミュレータで見ることができます。開始ビューの複製が右から左にスライドし、最後に新しいビューが表示されます。 'controller.view.layer'、' controller.view.superview.layer'、 'controller.view.window.layer'と同じことです。これが一般的な問題か、私のアプリで奇妙なものかカスタムトランジションをあきらめて。 –