【问题标题】:iPhone - presentModalViewController with transition from rightiPhone - presentModalViewController 从右侧过渡
【发布时间】:2011-10-16 02:51:37
【问题描述】:

我正在使用 presentModalView 控制器并通过其控制器将转换推送到新视图。 我正在使用以下代码进行转换(效果很好)

    [self presentModalViewController:myViewController animated:NO];
CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[myViewController.view layer] addAnimation:animation forKey:@"SwitchToView"];  

但问题是,它显示空白屏幕,然后开始转换。如何避免这种情况?

【问题讨论】:

    标签: iphone uiviewcontroller transition


    【解决方案1】:

    先加动画再呈现

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.5];
    [animation setType:kCATransitionPush];
    [animation setSubtype:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [[myViewController.view layer] addAnimation:animation forKey:@"SwitchToView"];  
    
    
    [self presentModalViewController:myViewController animated:NO];
    

    【讨论】:

    • 当我这样做时,视图来自右下角。但我想要一个和导航控制器类似的。 (但我的应用中没有导航控制器,我们不想实现它)
    • 对我来说它从右到左出现但仍然是白色背景:-(
    • 我在展示MFMailComposeViewController 时使用了这种技术,但是它在某些时候停止了正常工作,可能是iOS6。您可以在模拟器中看到它,起始视图的副本从右向左滑动,最后新视图才出现。我试过controller.view.layercontroller.view.superview.layercontroller.view.window.layer 和同样的东西。我想知道这是我的应用程序的普遍问题还是奇怪的问题,无论哪种方式我都放弃了自定义转换。
    【解决方案2】:

    由于没有人回答,我将发布对我有用的内容,让未来的寻求者找到有用的东西:

    我试图用 CATransition 在不同的 XIB 文件中显示视图,但一开始总是黑屏。

    解决方案是替换这些行

    [[myViewController.view layer];
    addAnimation:animation forKey:@"SwitchToView"];
    

    [[self.view.superview layer] addAnimation:animation forKey:@"SwitchToView"];
    

    找到问题后,就很容易理解了,因为很明显本地窗口就是你要“推送”的窗口。

    【讨论】:

      【解决方案3】:

      我认为,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())
              })
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-05
        • 1970-01-01
        • 2010-12-10
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        相关资源
        最近更新 更多