【问题标题】:Trigger viewWillAppear when using a transitioning delegate使用过渡委托时触发 viewWillAppear
【发布时间】:2016-07-20 14:08:53
【问题描述】:

我想展示一个视图控制器:

  • 模态
  • 使用自定义过渡
  • 同时,我想确保当它被解除时,它背后的视图控制器知道被推到前台

我的基本想法是尝试一些不同的配置,看看哪一个会导致 viewWillAppear 在后面的视图控制器上被调用。

尝试 1

presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate

这种方法的结果:

  • 自定义过渡效果非常好
  • 当我调用presentedViewController.dismissViewControllerAnimated(true) 时,viewWillAppear not 不会在 presentedViewController 后面的视图控制器上被调用

我确实希望 viewWillAppear 在被关闭的视图控制器下方被调用,所以我这样做了:

尝试 2

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
presentedViewController.transitioningDelegate = someTransitioningDelegate

这种方法的结果:

  • viewWillAppear 在关闭 presentedViewController 时在 presentedViewController 后面的视图控制器上被调用
  • 呈现视图控制器时,转换按预期发生。
  • 关闭视图控制器时,过渡期间的背景为黑色,这是不希望的。

似乎.FullScreen 导致presentedViewController 后面的视图控制器从显示层次结构中移除——这很好,因为大概这就是触发viewWillAppear 调用的原因。

尝试 3

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical

这样的结果是:

  • viewWillAppearpresentedViewController 后面的视图控制器上被调用。
  • 过渡期间的背景是位于presentedViewController 后面的视图控制器,这是理想的。
  • 没有自定义过渡。

我正在从事的项目的结构使得使用委托变得困难(这似乎是建议的答案here)。使用NSNotificationCenter 是另一种选择,它可以让我调用应该由viewWillAppear 调用的代码,但是从尝试3 开始,我希望有一种更优雅的方法来实现所有这些:

  1. 触发viewWillAppear
  2. 使用自定义过渡
  3. 在过渡动画期间查看在后台呈现的视图控制器

【问题讨论】:

    标签: ios swift uiviewcontroller


    【解决方案1】:

    似乎 Apple 认为调用 viewWillAppear 等是犯规,但调用 beginAppearanceTransitionendAppearanceTransitionwhich in turn will invoke viewWillAppear 是可以的。这个我会去的。

    【讨论】:

      【解决方案2】:

      我过去实现这一点的方法是从过渡动画师调用 viewWillAppear 和 viewDidAppear。这是一个简化的示例:

      public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
      
          let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
          let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
      
          fromVC.viewWillDisappear(true)
          toVC.viewWillAppear(true)
      
          UIView.animateWithDuration(0.3, animations: {
      
                  //Animations here
      
                  }, completion: { (success) in
                      toVC.viewDidAppear(success)
                      fromVC.viewDidDisappear(success)
                      transitionContext.completeTransition(true)
              })
      
      }
      

      我在做动画之前调用“will”方法,在完成之后调用“did”方法

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 2016-02-27
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        相关资源
        最近更新 更多