【问题标题】:presentViewController flickers in IOS 8presentViewController 在 IOS 8 中闪烁
【发布时间】:2016-04-11 17:48:34
【问题描述】:

在 iOS 7 中,我们做了一个自定义动画过渡到一个新的视图控制器,动画的完成是:

[self.animatedView removeFromSuperview]; //superview == self.view, in this case
[self presentViewController:newController animated:NO completion:nil];

这在

【问题讨论】:

  • 我遇到了同样的问题。除了@tdevoy 的建议使用UIViewControllerAnimatedTransitioning,您是否找到了解决方案?
  • 不,我最终使用了动画过渡,尽管做了完全相同的事情,但它添加了 70 行代码,执行速度较慢,并且存在其他问题。这就是您使用 Apple 库所获得的。
  • iOS 8 为这些东西提供了 UIPresentationController。

标签: ios objective-c uiviewcontroller ios8


【解决方案1】:

真的建议您在 iOS 7 及更高版本中采用 UIViewControllerAnimatedTransitioning 协议。它易于使用,并且针对任何过渡类型和长度进行了令人难以置信的优化。无论如何,请继续使用您自己的 ios 6 及更低版本的动画,但如果您采用 ios 7 及更高版本的新协议,您的动画将得到突飞猛进的改进。

查看UIViewControllerAnimatedTransitioning上的文档

【讨论】:

  • 你忘了说,这也是令人难以置信的错误,但无论如何这是唯一的方法。
  • 我没有看到任何问题。您遇到了什么错误?
  • 您可能很想阅读我为 iOS 7 编写的模态转换的源代码,后来为 iOS 8 修复。github.com/pronebird/CustomModalTransition/blob/master/…
  • 最重要的一点:iOS 7 上的旋转被破坏了。我不确定它是否在 iOS 8 上解决了。
  • iOS 8 上最好的就是使用 UIPresentationController。然后你可以处理旋转和一切。但这在 iOS 7 上是缺失的。
【解决方案2】:

我有同样的问题,我的解决方法是获得这两个类。

http://www.brightec.co.uk/blog/ios-7-custom-view-controller-transitions-and-rotation-making-it-all-work

只需将它们导入项目并设置转换委托即可:

BTSlideInteractor *interactor = [[BTSlideInteractor alloc] init];
interactor.presenting = YES;

UIStoryboard *storyboard = self.storyboard;
ViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"home"];
svc.modalPresentationStyle = UIModalPresentationCustom;
svc.transitioningDelegate = interactor;
[self presentViewController:svc animated:YES completion:nil];

您可以从委托类自定义转换。问候

【讨论】:

    【解决方案3】:

    我仍然在 iOS 9 上遇到这种情况。正如其他人所提到的,避免它的唯一方法似乎是创建一个实现 UIViewControllerAnimatedTransitioning 的对象。希望我可以节省其他人浏览这个文档记录不佳的 API 的时间。以下是您需要做的:

    1. 在要呈现的 VC 中设置 self.modalPresentationStyle = UIModalPresentationCustom;
    2. 在呈现的 VC 中,实现 UIViewControllerTransitioningDelegate 并执行以下操作:

      UIViewController* myVC = [[UIViewController alloc] init];
      myVC.transitioningDelegate = self;
      [self presentViewController:myVC animated:YES completion:nil];
      
    3. 在呈现的 VC 中返回您的自定义动画对象。

      - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
          return [[MXQuickFadeTransition alloc] init];
      }
      
      - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
          MXQuickFadeTransition* transition = [[MXQuickFadeTransition alloc] init];
          transition.duration = 0.3f;
          return transition;
      }
      
    4. 像这样实现转换:

      @implementation MXQuickFadeTransition
      
      - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext {
          return self.duration > 0 ? self.duration : 0.01f;
      }
      
      - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
          UIViewController *fromController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
          UIViewController *toController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
          UIView *containerView = transitionContext.containerView;
      
          const BOOL isPresenting = [toController presentedViewController] != fromController;
      
          if (isPresenting) {
              [containerView addSubview:toController.view];
              [containerView bringSubviewToFront:toController.view];
          }
      
          fromController.view.alpha = 1.0f;
          toController.view.alpha = 0.0f;
          [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
              fromController.view.alpha = 0.0f;
              toController.view.alpha = 1.0f;
          } completion:^(BOOL finished) {
              [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
          }];
      }
      
      @end
      

    有用的参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      相关资源
      最近更新 更多