使用过渡委托时触发 viewWillAppear

Posted

技术标签:

【中文标题】使用过渡委托时触发 viewWillAppear【英文标题】:Trigger viewWillAppear when using a transitioning delegate 【发布时间】: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 开始,我希望有一种更优雅的方法来实现所有这些:

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

【问题讨论】:

【参考方案1】:

似乎 Apple 认为调用 viewWillAppear 等是犯规,但调用 beginAppearanceTransitionendAppearanceTransition、which 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”方法

【讨论】:

以上是关于使用过渡委托时触发 viewWillAppear的主要内容,如果未能解决你的问题,请参考以下文章

如何触发css3过渡动画

如果应用了 css 过渡,为啥动画回调函数会立即触发?

当我添加 NSPredicate 时,为啥我的 NSFetchedResultsController 委托停止触发?

响应式断点触发的 CSS 过渡

当触发 iOS Safari 中的虚拟键盘时,它会使我的 CSS 过渡闪烁。如何解决这个问题?

当应用程序处于非运行状态时,推送通知委托触发的解决方案是啥?