对于自定义 segue 动画,如何告诉 ViewController 它是动画的?

Posted

技术标签:

【中文标题】对于自定义 segue 动画,如何告诉 ViewController 它是动画的?【英文标题】:For custom segue animation, how to tell the ViewController that it was animated? 【发布时间】:2014-01-02 15:42:18 【问题描述】:

这是我的自定义转场动画的代码:

[UIView animateWithDuration:.4 animations:^
    destinationViewController.view.frame = targetFrame;
    buttonBarImageView.alpha = 0.0;
 completion:^(BOOL finished) 
    [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
    [buttonBarImageView removeFromSuperview];
];

请注意,在上面的代码中,我在presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion 中为animated 传递了NO,因为我正在使用我的自定义动画并且不想使用任何标准动画。

我的目标视图控制器的方法viewWillAppear:(BOOL)animated 现在应该根据动画标志表现不同。在 VC 中,标志决定是否应该播放额外的内部动画。存在各种目标 VC,它们具有不同的内部动画。它们是我上面所说的自定义动画的补充。

但是,我不能将YES 传递给VC,因为我必须将NO 传递给presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion,这会导致NO 传递给VC。

如何防止presentViewController:... 运行动画并仍将YES 传递给VC 的viewWillAppear:(BOOL)animated 方法?

【问题讨论】:

【参考方案1】:

一种检查方法是在调用[super viewWillAppear:] 时将NO 传递给super

- (void)viewWillAppear:(BOOL)animated 

    [super viewWillAppear:NO];
    //-- your own animation here

因此您可以将YES 传递给presentViewController:,但在将其传递给super 时会覆盖它。

如果这不起作用,我敢打赌你唯一的机会是将NO 传递给presentViewController: 并将你自己的标志添加到视图控制器,这样你就可以控制它是否是自定义动画。

【讨论】:

将 NO 传递给 VC 的超类不会关闭内置标准动画。动画发生在 viewWillAppear: 被调用之前。 很有趣,谢谢。那么我看到的唯一方法是使用您自己的标志,这样您就可以始终将NO 传递给presentViewController... 是的,如果没有其他解决方案,我会这样做。

以上是关于对于自定义 segue 动画,如何告诉 ViewController 它是动画的?的主要内容,如果未能解决你的问题,请参考以下文章

自定义推送 segue 动画

自定义 Segue 动画显示黑屏

使用情节提要逆转自定义 Segue

自定义 segue 和导航控制器动画故障

自定义 segue 过渡动画

动画状态栏以及segue中的自定义转换