5

我正在制作一个iOS游戏,我想达到这个效果: 暂停弹出 2 个不同的控制器

我知道如何使用一个视图控制器来做到这一点,但是我的视图控制器类已经被代码臃肿,并且该屏幕的情节提要一团糟(实际上我有更多的视图,上面的图像,我只是为了清楚起见而隐藏了它们)。

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

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

提前致谢。

4

4 回答 4

16

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

我附上示例代码

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

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

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

3 - 创建自己的 segue 类的子类 UIStoryboardSegue。然后,用类似这样的东西覆盖 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 类名称。

呸呸呸!

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

于 2013-05-01T20:55:15.907 回答
2

您应该查看 childViewControllers。看起来你想要实现这样的目标。

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

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

苹果文档

于 2013-05-01T13:51:48.850 回答
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;
        }];
    }
于 2013-08-27T21:11:31.647 回答
0

假设你没有使用 cocos 2d 的场景。在简单的 iOS 中,最好的解决方案是使用容器 Controller

  1. 转到故事板并将容器控制器拖动到主视图控制器(就像拖动 UIlabel 一样)
  2. 设置容器的大小。另一个嵌入式视图将从相同大小的容器控制器中弹出。给这个视图控制器一个新的类名。
  3. 为容器制作一个出口并根据需要显示/隐藏容器。

如果您无法做到这一点,我将在此站点上制作教程。如果你想让我这样做,请在下面评论。

于 2013-05-04T21:13:26.917 回答