使用自定义 segue 动画将一个视图替换为另一个视图?

Posted

技术标签:

【中文标题】使用自定义 segue 动画将一个视图替换为另一个视图?【英文标题】:Displacing one view with another with a custom segue animation? 【发布时间】:2012-04-05 19:12:54 【问题描述】:

我正在尝试实现 SUBJ,但无法使目标转场出现在我的动画中。我想为视图更改制作动画,其中新的 segue 将取代旧的。目前我的执行方法如下所示:

- (void) perform 

UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;

[UIView animateWithDuration:2.0
                 animations:^

                 //tried a lot of staff to make dst view to fall from top at the same time as current view falling to bottom but failed. 

                 src.view.transform=CGAffineTransformMakeTranslation(0, 480);
                 
                 completion:^(BOOL finished) 
                     [[self sourceViewController] presentModalViewController:[self destinationViewController] animated:NO];
                 
    ];

任何想法如何添加到我的动画块从顶部出现的新视图?

非常感谢!

编辑:

- (void) perform 

    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;

    src.view.transform = CGAffineTransformMakeTranslation(0, 0);
    dst.view.transform = CGAffineTransformMakeTranslation(0, -480);

    [UIView animateWithDuration:2.0
                 animations:^
                         [src.view addSubview:dst.view];
                         src.view.transform = CGAffineTransformMakeTranslation(0, 460);

                     
                     completion:^(BOOL finished) 
                         [src presentModalViewController:dst animated:NO];
                     
     ];


我最后就是这么干的。

【问题讨论】:

就是这么简单! ...***.com/a/25482006/294884 【参考方案1】:

我不太明白你所说的 new 和 old 是什么意思,所以我假设 new = dst 和 old = src。

- (void) perform 

   UIViewController *src = (UIViewController *) self.sourceViewController;
   UIViewController *dst = (UIViewController *) self.destinationViewController;

   src.view.transform = CGAffineTransformMakeTranslation(0, 0);
   dst.view.transform = CGAffineTransformMakeTranslation(0, -480);

   [UIView animateWithDuration:2.0
                 animations:^
                     [src presentModalViewController:dst animated:NO];
                     src.view.transform = CGAffineTransformMakeTranslation(0, 480);
                     dst.view.transform = CGAffineTransformMakeTranslation(0, 0);
                 
   ];

应该这样做。

【讨论】:

感谢您的回复。当然你是对的,新的是 dst。不知何故,没有任何改变,并且在动画 dst 视图期间没有出现。我也不明白为什么 presentModalViewController 在这里是错误的。 link我从这里拿的。 你说得对,对不起,我不太喜欢故事板。提高了我的回答。我希望,这会有所帮助。这是我最后一次看起来严肃的机会。 ;) 再次感谢您帮助我。我现在在尝试您的代码时发现:动画发生在不同的视图上。因此,如果我在动画完成之前使用您的代码并更改视图,我只会看到 dst 视图动画。有什么想法可以让它们同时制作动画,而不需要像一个大的超级视图或其他一些令人不快的代码这样的脏补丁吗?说清楚。如果我在完成后使用 presentModalViewController,我只会看到 src 视图动画。如果我在只看到第二个视图动画之前使用它。而且我不知道如何组合它们 完成之前之后=动画完成之前*

以上是关于使用自定义 segue 动画将一个视图替换为另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现自定义segue动画?

自定义 segue 过渡动画

自定义 Segue 在显示目标视图控制器之前动画为黑色

自定义推送 segue 动画

关闭自定义模式视图控制器

不使用 Storyboard segues 的自定义视图转换 (Swift)