【问题标题】:Custom Animation for Pushing a UIViewController推送 UIViewController 的自定义动画
【发布时间】:2010-11-27 05:19:57
【问题描述】:

我想在推送视图控制器时显示自定义动画:我想实现类似“展开”动画的效果,这意味着新视图从给定的矩形展开,假设在动画期间为 [100,100 220,380]全屏。

任何建议从哪里开始,分别是任何文档、教程、链接? :)


好的。我可以使用以下代码制作展开动画:

if ([coming.view superview] == nil)   
    [self.view addSubview:coming.view];
    coming.view.frame = CGRectMake(160,160,0,0);
    [UIView beginAnimations:@"frame" context:nil];
    [UIView setAnimationDuration:4];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [coming viewWillAppear:YES];
    [going viewWillAppear:YES];
    coming.view.frame = CGRectMake(0, 0, 320, 480);
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];
    [UIView commitAnimations];

我的视图已正确显示,但遗憾的是导航栏未更新。有没有办法手动做到这一点?


在示例代码中,一个函数在 0.03 秒内被调用,更新视图的转换。 不幸的是,当推送UIViewController 时,我无法调整视图框架的大小……是吗?

【问题讨论】:

    标签: iphone animation uikit uiviewcontroller uinavigationcontroller


    【解决方案1】:

    您可以做的是推动下一个视图控制器,但不要对其进行动画处理,如下所示:

    [self.navigationController pushViewController:nextController animated:NO];
    

    ...然后,在被推入的视图控制器中,您可以使用 CoreAnimation 对其视图进行自定义动画。这可能最好在 viewDidAppear:(BOOL)animated 方法中完成。

    查看Core Animation Guide,了解如何实际制作动画。特别看隐式动画。

    编辑: updated link

    【讨论】:

    • 我已经尝试过这种方法,但问题是当你使用这个推送时,第一个视图控制器在下一个控制器开始动画之前消失了。应该发生的是: 1)下一个视图控制器动画并且它的视图完全覆盖了旧 vc 的视图,然后旧 vc 弹出。我正在为 iOS 4.3 进行编译,但这不起作用。
    • 这也是不可扩展的。导航控制器应该处理动画。这是一个你必须为每个被推送的视图控制器实现的技巧。
    【解决方案2】:

    看看ADTransitionController,它是我们在 Applidium 创建的带有自定义过渡动画(其 API 与 UINavigationController 的 API 匹配)的 UINavigationController 的替代品。

    您可以为 pushpop 动作使用不同的预定义动画,例如 SwipeFadeCubeCarrousel 等等。在您的情况下,您请求的动画是名为 Zoom 的动画。

    【讨论】:

      【解决方案3】:

      @zoul:效果很好!我只是将“self”更改为“self.navigationController”,将“self.view”更改为“self.navigationController.view”不知道这是否有必要,但它确实有效。而@crafterm,至于弹回,只需在 viewDidLoad 或 ViewWillAppear 中添加此代码即可制作自己的 leftBarButtonItem:

      //add your own left bar button
      UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)];
      self.navigationItem.leftBarButtonItem = backButton;
      [backButton release];
      

      然后我只是调整了 push 函数并创建了我在 -backButtonTapped 方法中调用的 popWithTransition 函数。

      - (void) popWithTransition: (UIViewAnimationTransition) transition
      {
          [UIView beginAnimations:nil context:NULL];
          [UIView setAnimationDuration:.75];
          [UIView setAnimationBeginsFromCurrentState:YES];        
          [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES];
          [UIView commitAnimations];
      [self.navigationController popViewControllerAnimated:NO];
      }
      

      请注意,popViewController 调用在动画之后被移到了末尾。不知道这是否符合犹太教规,但同样有效。

      【讨论】:

        【解决方案4】:

        您要查找的代码:

            [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.80];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        
        [UIView setAnimationTransition:
         UIViewAnimationTransitionFlipFromRight
                               forView:self.navigationController.view cache:NO];
        
        
        [self.navigationController pushViewController:menu animated:YES];
        [UIView commitAnimations];
        

        【讨论】:

        • popViewController场景如何处理?
        【解决方案5】:

        我使用如下函数(添加到UINavigationController)来自定义推送动画:

        - (void) pushController: (UIViewController*) controller
                 withTransition: (UIViewAnimationTransition) transition
        {
            [UIView beginAnimations:nil context:NULL];
            [self pushViewController:controller animated:NO];
            [UIView setAnimationDuration:.5];
            [UIView setAnimationBeginsFromCurrentState:YES];        
            [UIView setAnimationTransition:transition forView:self.view cache:YES];
            [UIView commitAnimations];
        }
        

        我想你可以调整这段代码来做任何你想要的动画。

        【讨论】:

        • 不错,你如何处理popViewController的情况?从我所见,即使您重载后退按钮并提供一个后退按钮,点击后退按钮也不会调用任何给定的目标/选择器对,因此您不能将其设置为指向包含动画的自定义弹出方法?
        • 我记得与自定义动画斗争了一段时间,然后寻求一些不那么痛苦的解决方案。我不记得我最终使用了什么,但它可能类似于公认的答案(或者我只是放弃并使用了工厂转换)。
        • category on UINavigationController 似乎是个好地方。
        • 有一个答案below 与此,但我想我会在这里提到您可以轻松地使用popController 做同样的事情
        【解决方案6】:

        你想要的是iphone developers cookbook第2章的下载。请具体查看 affineRotate 示例,尽管任何核心 animatin 示例都会对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          • 2012-07-02
          相关资源
          最近更新 更多