使用CATransition同时动画转换两个子视图

时间:2012-02-19 21:58:26

标签: iphone ios cocoa-touch

我有我的主视图,当用户点击“显示”按钮时,我想要发生两件事:

  1. 淡化UIView黑色darkenBackground,alpha 0.5覆盖整个父母 视图。我将其称为self.secondViewController.view
  2. 滑动第二个视图控制器的视图 darkenBackground
  3. 之上的{darkenBackground}

    当用户完成后,他们点击“完成”并发生以下情况:

    1. self.secondViewController.view淡出并从superview中移除。
    2. darkenBackground滑出屏幕 底部方向,并从superview中删除。
    3. 所有动画同时工作。

      到目前为止,我已经能够实现第一部分(排序),过渡。这很好用。但是当用户点击“完成”时,转换不能按要求工作。我面临的问题是:

      1. self.secondViewController.viewself.secondViewController.view淡出并被删除,但是 - (IBAction)showSecondView { darkenBackground = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)]; [darkenBackground setBackgroundColor:[UIColor blackColor]]; [darkenBackground setAlpha:0.5]; self.secondViewController.view.frame = CGRectMake(0, 0, 320, 460); self.secondViewController.view.backgroundColor = [UIColor clearColor]; [CATransaction begin]; CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionFade]; CATransition *animation2 = [CATransition animation]; [animation2 setDuration:0.5]; [animation2 setType:kCATransitionMoveIn]; [animation2 setSubtype:kCATransitionFromTop]; [animation2 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [self.view addSubview:darkenBackground]; [self.view addSubview:self.secondViewController.view]; [[self.view layer] addAnimation:animation forKey:@"darkenBkgFadeIn"]; [[self.secondViewController.view layer] addAnimation:animation2 forKey:@"ShowSecondView"]; [CATransaction commit]; } 不应该淡出!我尝试仅动画第二个视图,但它只是在没有动画的情况下消失。
      2. 当用户点击“显示”时间时 (transition-in),来自前一过渡的视图 在动画发生之前出现。看起来不像 之前从超级视图中删除了。
      3. 这是我的代码:

        当用户点击“显示”时:

        secondViewController.m

        当用户点击“完成”时(在- (IBAction)hideSecondView { [CATransaction begin]; CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionFade]; CATransition *animation2 = [CATransition animation]; [animation2 setDuration:0.5]; [animation2 setType:kCATransitionPush]; [animation2 setSubtype:kCATransitionFromBottom]; [animation2 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [self.myParentController.darkenBackground removeFromSuperview]; [self.myParentController.secondViewController.view removeFromSuperview]; [[self.myParentController.view layer] addAnimation:animation forKey:@"darkenBkgFadeOut"]; [[self.myParentController.secondViewController.view layer] addAnimation:animation2 forKey:@"RemoveSecondView"]; [CATransaction commit]; } 类中定义的函数,它通过委托引用主视图控制器变量):

        TWTweetComposeViewController

        最终,我希望以{{1}}模态视图出现的相同方式显示视图,背景变暗,控制器出现。我可以使用模态视图控制器,但我遇到的问题是,当呈现视图控制器时它只“出现”并且不会从底部滑动(因为我需要半透明背景,我不能使用默认模态视图的上下文)。

        无法想出这一点,会很感激一些指导。

1 个答案:

答案 0 :(得分:0)

我认为self.myParentController.view中使用的-hideSecondViewself.view-showSecondView的视图相同。如果是这种情况,那么您将在此处应用转换到整个视图:

[[self.myParentController.view layer] addAnimation:animation forKey:@"darkenBkgFadeOut"];

您在self.secondViewController.view中添加了self.view作为-showSecondView的子视图,因此当您稍后在self.myParentController.view上执行转换时,它会将转换应用于其所有子视图(即self.secondViewController.view)。

不是将转换应用于self.myParentController.view中的-hideSecondView,而是直接应用于darkenBackground

[[self.myParentController.darkenBackground layer] addAnimation:animation forKey:@"darkenBkgFadeOut"];

如果我没记错的话,您可以在向视图中添加/删除图层时应用CATransitions。如果没有,那么你必须将darkenBackground包装在一个单独的容器视图中并执行转换,以便在淡出时不包含self.secondViewController.view