iOS:视图控制器之间的动画

Posted

技术标签:

【中文标题】iOS:视图控制器之间的动画【英文标题】:iOS: animation between view controllers 【发布时间】:2013-07-04 23:10:08 【问题描述】:

我在任何地方都找不到这个。所以,如果你有这方面的信息,请给我一个链接。

我有一个视图控制器,我为一个简单的游戏制作了一个菜单。上面有一些按钮。 我有另一个视图控制器,还有一些按钮。

问题是: “在我选择一个触发自定义segue(没有任何动画)到另一个视图控制器的按钮后,我如何制作这个按钮的动画(隐藏屏幕),另一个视图控制器将运行它的按钮动画(从边框进入屏幕)屏幕)?”

我是这样设计的:

1) 理论:我为菜单按钮制作了一个 IBAction,然后在这个 IBAction 中我调用了一个动画方法,它调用了一个 performSegueMethod:。之后在新的 VC 中的 viewWillAppear 方法中调用一个动画方法(即来自源 VC 的几乎相等的方法)。所有这些都有效,但这看起来并不顺利。当目标 VC 替换源 VC 时,会出现此动画的问题。有一些瞬间,当一切看起来都是静止的,并且只有在这个动画开始之后。 我不知道如何消除这个目标 VC 滞后。可能我必须在 segue 之前加载目标视图?我试图这样做,但可能是做错了什么,或者它只是不帮助我。

2) 练习:

firstViewController.m:

- (IBAction)newGameSegueButton 

[self menuSlideInDirection:@"CenterToLeft" performingSegueWithIdentifier:@"mode"];




-(void)menuSlideInDirection:(NSString *)direction performingSegueWithIdentifier:(NSString *)segueIdentifier



[UIView animateWithDuration:0.4 animations:^

    CGPoint newGameButtonCenter;
    newGameButtonCenter.x = directionIndex * 160;
    newGameButtonCenter.y = self.gameButtonSlide.center.y;
    self.gameButtonSlide.center = newGameButtonCenter;

    [UIView animateWithDuration:0.3 delay:0.1 options:UIViewAnimationOptionBeginFromCurrentState animations:^
       //some animation too

     completion:nil];


    [UIView animateWithDuration:0.2 delay:0.2 options:UIViewAnimationOptionBeginFromCurrentState animations:^
        //animation 

     completion:nil];


    [UIView animateWithDuration:0.1 delay:0.3 options:UIViewAnimationOptionBeginFromCurrentState animations:^
       //some animation too

     completion:^(BOOL finished)

        if(segueIdentifier)
            [self performSegueWithIdentifier:segueIdentifier sender:self];

        
    ];





];



好的,那么自定义 segue 代码就很简单了:

-(void)perform



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

[src.navigationController pushViewController:dst animated:NO];



还有我的 secondViewController.m:

-(void)viewWillAppear:(BOOL)animated

[super viewWillAppear:animated];


[self menuSlideInDirection:@"RightToCenter" performingSegueWithIdentifier:nil];


menuSlideInDirection:@"RightToCenter" 在 secondViewController 中执行SegueWithIdentifier:nil 与 firstView 中具有相同名称的方法相同。

我正在寻找目标视图控制器的特定对象在转场之后的流畅动画。

可能是做错了,还有另一种方法吗? (我只想将目标 VC 的所有视图和所有控件添加到源 VC 并完全删除“目标 VC”)。

希望有人能帮我解决这个问题。

【问题讨论】:

你正在对新的视图控制器进行什么转场转换? 嗯,我想我不使用任何 segue 过渡,正如您在我的 perform 方法中看到的那样。我没听错吧? 你打电话给performSegueWithIdentifier:。这是一个推动,模态?它是一种什么样的segue?再说一次,这可能无关紧要。我只是好奇而已。您是正确的,将两个视图放在同一个 VC 下将使整个过程在您的控制之下,并使您能够确保它是顺利的。否则,您可以按照 Roshan 的建议进行破解。 @MattMc 我使用自定义 segue,嗯,我不知道,老实说,是 push 还是模态。我发布了一个自定义的 segue 类执行方法。我认为,实际上它是一个 push segue。 【参考方案1】:

尝试在perform 方法中制作所有第一个视图控制器的动画。

至于第二个视图控制器的动画,我认为除了在viewWillAppear(尽管我更喜欢viewDidAppear)中做它之外,没有任何其他“好”方法,因为目标视图控制器的出口不是在执行 segue 时设置(它们将为零)。换句话说,您无法访问按钮,更不用说为它们设置动画了。

一种骇人听闻的方法是在perform 之前调用[segue.destinationViewController view],以便加载目标视图控制器的视图层次结构并设置出口。然后,也许,您可以在将目标视图控制器中的 perform 中的按钮推送到导航堆栈之前对其进行动画处理。

【讨论】:

如果我在自定义 segue 类中没有此按钮的出口,如何在 perform 方法中完成所有第一个 VC 动画? “hackish 方式”和目标 VC 网点的相同问题 我说得对吗,[segue.destinationViewController view] 我必须添加以准备转场? 忘了说,这一切都不起作用,正如我想要的那样:(在代码更改之后没有明显的变化。【参考方案2】:

对于我的问题,我选择将两个视图放在同一个VC下的方式。动画很流畅,看起来比使用 perform / viewWillAppear 方法好多了。

【讨论】:

以上是关于iOS:视图控制器之间的动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 创建自定义过渡动画

同一屏幕上的子视图控制器之间的 IOS 转换

动画期间键盘和文本视图之间的间隙

自定义 iOS 导航控制器动画:这是错的吗?

两个根演示文稿之间的 MvvmCross v5 动画

使用容器视图控制器,如何在子视图控制器之间添加交互式动画?