【问题标题】:When programatically creating a ViewController, how can I set its view to be of type SKVIew?以编程方式创建 ViewController 时,如何将其视图设置为 SKVIew 类型?
【发布时间】:2015-06-27 06:04:55
【问题描述】:

我正在 XCode 上开发 iOS 游戏。我有几个 SKScene,每个都与一个 UIViewController 类相关联。所以在每个视图控制器的 viewDidLoad 中,我创建了

SKView *skView = (SKView *)self.view
SKScene * scene = [whateverSKScene sceneWithSize:skView.bounds.size]
[skView present scene]

我想避开故事板。但是,当我将 ViewController 从第一个视图控制器呈现到下一个时,应用程序在“[skView present scene]”行崩溃,因为它认为新视图控制器的视图仍然是 UIView ('-[UIView presentScene:]: unrecognized selector sent实例)。

我该如何解决这个问题?具体来说,在创建第二个视图控制器(以编程方式)时,如何将其视图更改为 SKview 而不是 UIview 类型? (我应该注意我希望场景与视图控制器是 1:1 的,因为几乎所有场景都是弹出窗口,比如在游戏中弹出的暂停菜单或弹出设置等)

【问题讨论】:

  • 如何创建第二个视图控制器。如果您不使用故事板/笔尖,则由您来创建 SKView 并将其分配为视图 - 您不能只检索它
  • 视图控制器被创建并呈现在第一个视图控制器中,例如: UIVIewController *test = [[MyViewController2 alloc] init]; [self presentViewController:测试动画:YES];
  • 那么在视图控制器的初始化程序中,您负责分配 SKView 并将其分配给控制器的视图属性。
  • 我已经得出结论,但据我所知,我的解决方案不起作用(如下)。我将如何分配 SKview?下面的结果只是在我当前的屏幕上以灰色屏幕显示动画。 UIVIewController *test = [[MyViewController2 alloc] init]; test.view = [[SKView alloc] init]; [self presentViewController:测试动画:YES];
  • 不行,你需要修改你自定义的UIViewController子类的init方法来初始化你的SKView

标签: ios objective-c uiviewcontroller sprite-kit transition


【解决方案1】:

尝试在您的自定义 ViewController 上实现 loadView 方法,如下所示:

override func loadView() {
        self.view = SKView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))
}

这是 Apple 的文档所述:

这是子类应该创建其自定义视图层次结构的地方,如果 他们没有使用笔尖。永远不应该直接调用。

【讨论】:

  • 您应该使用UIScreen.mainScreen.applicationFrame 而不是硬编码的矩形。
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多