我正在制作一个简单的游戏。故事板流程看起来像:
[Title Screen] --> [Game Screen] --> [Game Over Screen]
从Game Over屏幕,当用户按下MENU时,我想直接跳回标题屏幕,而不会看到游戏屏幕出现。
我第一次尝试这样做是在我的GameOverViewController
:中
- (void) pressesBegan:(NSSet<UIPress*>*) presses withEvent:(UIPressesEvent*) event
{
for (UIPress* press in presses)
{
if (press.type == UIPressTypeMenu)
{
[self.navigationController popToRootViewControllerAnimated:NO];
return;
}
}
[super pressesBegan:presses withEvent:event];
}
它正确弹出,但动画未被禁用。你可以清楚地看到游戏屏幕出现了一秒钟,有一个非常明显的淡入/淡出过渡。游戏视图甚至得到-viewWillAppear:
和-viewWillDisappear:
消息。
所以接下来,我尝试将pop
替换为一个展开段。
[self performSegueWithIdentifier:@"Game Over to Title" sender:self];
这种效果看起来略有不同——出于某种原因,游戏屏幕只显示了非常短暂的时间——但在我们回到标题之前,它至少可以显示1到2帧。我已经禁用了Xcode中展开片段上的"动画"复选框。
我该怎么做?我准备完全抛弃故事板,试着用另一种方式来做。我觉得它们比自己管理笔尖更复杂。如果我不能让分段干净地进行,我唯一能想到的其他选择就是在层次结构中引入一个虚拟黑屏,并找出如何通过弹出和分段进行转换:
[Game Screen]
/
[Title Screen] --> [Dummy Black Screen]
[Game Over Screen]
在新的导航控制器中包含所有"popable"导航,并在需要时弹出导航控制器本身。我认为它必须以模式呈现,但我不确定这部分。在这两种情况下都试一下,这几乎是一句俏皮话。
或者(这不是干净的)你可以先弹出没有动画的父控制器,这对用户来说是不可见的,然后像你做的那样popToRoot
。如果中间视图已经弹出,那就太好了,只是它在其他地方不能真正重复使用,而且这是一种糟糕的做法。