如何在iOS中从vc1.view转换到vc2.view,没有任何导航控制器?

时间:2012-12-14 23:49:48

标签: ios uiview transition

我有vc1.view覆盖整个屏幕,我希望能够调暗vc1.view,并让vc2.view放大到整个屏幕。

我的应用程序中没有任何导航控制器,那么实现目标的最佳做法是什么?我想到的解决方案是:

  • 将vc1.view和vc2.view添加到公共容器视图中
  • 使用[UIView transitionFromView:vc1.view toView:vc2.view ......]

我不喜欢必须将不同vc的视图添加到公共容器视图中。有什么建议?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用transitionFromView:toView:...而无需将新视图添加到公共容器,因为该转换方法负责添加视图。以下对我有用。代码位于视图控制器中,其视图是“从视图”。我在这里使用交叉淡入淡出,但您可以将其更改为任何其他可用方法:

-(void)switchViews:(id)sender {
    UIWindow *win = self.view.window;
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
    yellow.view.frame = self.view.frame;
    [UIView transitionFromView:self.view toView:yellow.view duration:2 options:UIViewAnimationOptionTransitionCrossDissolve completion:^(BOOL finished) {
        win.rootViewController = yellow;
    }];
}

但是,要进行自定义转换,您必须将新视图添加为“视图”所在视图的子视图(我认为)。在此示例中,这是窗口的视图。此代码从旧的中心增加新视图,而那个视图淡出。在转换结束时,视图控制器切换到拥有新视图的视图(在这种情况下为黄色)

编辑后:我改变了这个方法以使用CGAffineTransform(感谢jrturton对我的问题的答案提出的建议):

-(void)switchViews3:(id)sender {
    UIWindow *win = self.view.window;
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"];
    yellow.view.frame = self.view.frame;
    yellow.view.transform = CGAffineTransformMakeScale(.1, .1);
    [win addSubview:yellow.view];

    [UIView animateWithDuration:.6 animations:^{
        yellow.view.transform = CGAffineTransformIdentity;
        self.view.alpha = 0;
    }
                 completion:^(BOOL finished) {
                     [self.view removeFromSuperview];
                     win.rootViewController = yellow;
                 }];

}

答案 1 :(得分:1)

要在没有导航控制器的情况下从vc1呈现到vc2,请使用

[vc1 presentViewController:vc2 animated:YES completion:nil];

为了改变呈现风格,Apple提供了一些。你只需要在调用上面的代码之前设置它:

vc2.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

以下是清单:

typedef enum {
   UIModalTransitionStyleCoverVertical = 0,
   UIModalTransitionStyleFlipHorizontal,
   UIModalTransitionStyleCrossDissolve,
   UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;