如何在iOS中的单独ViewController中创建弹出/对话框视图?

时间:2013-04-26 18:30:37

标签: ios user-interface uiviewcontroller uipopovercontroller uistoryboardsegue

我正在制作iOS游戏,我希望达到这样的效果: pause popup 2 different controllers

我知道如何使用一个视图控制器来完成它但是我的视图控制器类已经膨胀了代码并且该屏幕的故事板是一团糟(我实际上有更多的视图,上面的图像,我只是隐藏它们为了清晰原因)。

所以我的问题是:有没有办法通过使用一个单独的视图控制器来管理这个暂停弹出窗口来实现这一目的?我需要一个不会忽略之前呈现的屏幕的segue。我想用故事板来做那件事。我试过“popover”segue,但它出现了一个我不想要的怪异边框。

此外,我还需要暂停视图控制器不管理的所有控件都停止侦听事件。我想到使用覆盖整个屏幕的黑色透明视图作为暂停视图的BG,并使其忽略事件。有更好的方法吗?

提前致谢。

4 个答案:

答案 0 :(得分:16)

如果你想使用故事板来实现它,那很简单。

我附上example code

1 - 在Storyboard中创建自定义PauseViewController。使用全屏视图,黑色,Alpha 0和包含暂停控件的子视图。创建相应的.h和.m文件

2 - 添加并链接您的控件(UIButtons)。添加这样的dismiss方法。 此方法将从层次结构中删除视图,并使其不可见,从而在关闭时更改alpha。

- (IBAction)dismiss:(id)sender {
    [UIView animateWithDuration:0.3f animations:^{
        self.view.alpha = 0.0f;
    } completion:^(BOOL finished) {
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
    }];
}

3 - 子类UIStoryboardSegue创建自己的segue类。 然后,用这样的方法覆盖perform方法。这只需要两个控制器(源和目标),并使用动画将目标视图放在源视图上。

-(void)perform{
    UIViewController *dst = [self destinationViewController];
    UIViewController *src = [self sourceViewController];

    // add the view to the hierarchy and bring to front
    [src addChildViewController:dst];
    [src.view addSubview:dst.view];
    [src.view bringSubviewToFront:dst.view];

    // set the view frame
    CGRect frame;
    frame.size.height = src.view.frame.size.height;
    frame.size.width = src.view.frame.size.width;
    frame.origin.x = src.view.bounds.origin.x;
    frame.origin.y = src.view.bounds.origin.y;
    dst.view.frame = frame;

    [UIView animateWithDuration:0.3f animations:^{ 
        dst.view.alpha = 0.5f;
    }];
}

4 - 链接你的segue,选择自定义并插入自定义segue类名。

钽daaaa!

如果您需要其他详细信息,请查看示例代码或添加评论。

答案 1 :(得分:2)

您应该查看childViewControllers。看起来你想要达到这样的效果。

PauseMenuViewController *pauseMenuVC = [[PauseMenuViewController alloc] init]; 
[self addChildViewController:pauseMenuVC];
if ([self isViewLoaded]){
    [self.view addSubview:pauseMenuVC.view];
}

您应该能够创建自己的菜单动画,进入视图并调暗背景。

Apple Docs

答案 2 :(得分:0)

假设您没有使用cocos 2d的场景。在简单的iOS中,最佳可行解决方案是使用容器控制器

  1. 转到故事板并将容器控制器拖到主视图控制器上(就像拖动UIlabel一样)
  2. 设置容器的大小。另一个嵌入式视图将弹出相同大小的容器控制器。为此视图控制器提供一个新的类名。
  3. 根据需要为容器制作出口并显示/隐藏容器。
  4. 如果您无法执行此操作,我将在此网站上制作教程。如果你想让我这样做,请在下面评论。

答案 3 :(得分:0)

作为与UIStoryboardSegue子类相关的答案的变体,您还可以使用透明的1x1“blank.png”图像。这样你只需要关注弹出窗口视图控制器的子视图的alpha,这样如果需要,中间的弹出窗口可以具有完全可见性。

    -(void)perform
    {
        UIViewController *dst = [self destinationViewController];
        UIViewController *src = [self sourceViewController];

        // add the view to the hierarchy and bring to front
        [src addChildViewController:dst];
        [src.view addSubview:dst.view];
        [src.view bringSubviewToFront:dst.view];

        // set the view frame
        CGRect frame;
        frame.size.height = src.view.frame.size.height;
        frame.size.width = src.view.frame.size.width;
        frame.origin.x = src.view.bounds.origin.x;
        frame.origin.y = src.view.bounds.origin.y;
        dst.view.frame = frame;
        dst.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"blank.png"]];

        [UIView animateWithDuration:0.3f animations:^{
            dst.view.alpha = 1;
        }];
    }