![](/img/trans.png)
[英]Unable to segue from Spritekit SKScene to another UIViewController, XCODE8/Swift
[英](Swift2 SpriteKit) How to transition between an SKScene and a UIViewController efficiently?
关于这个话题似乎有很多矛盾的想法。 我只是希望将菜单放在UIViewController中,将游戏放在SKScene中
在我的SKScene中,我使用了:
self.removeFromParent()
self.view?.presentScene(nil)
删除了节点,但是场景仍然存在,因为我仍然具有灰色背景和fps计数器。 我可以返回UIViewController的View方面并隐藏场景吗?
我的方法一实现:
RootViewController:
class RootViewController: UIViewController {
var menu = MenuViewController()
var game = GameViewController()
override func viewDidLoad() {
super.viewDidLoad()
print("root")
MenuPresent()
}
func GamePresent() {
self.addChildViewController(game)
self.view.addSubview((game.view)!)
game.didMoveToParentViewController(self)
}
func MenuPresent() {
self.addChildViewController(menu)
self.view.addSubview((menu.view)!)
menu.didMoveToParentViewController(self)
}
func menuDismiss() {
menu.willMoveToParentViewController(nil)
menu.removeFromParentViewController()
menu.view.removeFromSuperview()
}
}
MenuViewController:
class MenuViewController: UIViewController {
//var root = RootViewController()
override func viewDidLoad() {
super.viewDidLoad()
print("menu")
}
}
print(“ menu”)出现在我的控制台中,但是菜单ViewController的实际视图和所有资产都没有出现。
另一方面,我的GameViewController及其SKScene工作正常。
视图和场景是两个不同的事物。 场景保存在视图内部。 您只需要在菜单视图中呈现一个场景或过渡到另一个视图,然后从那里呈现一个SKScene。 呈现场景的代码可能如下所示:
let scene = GameScene(fileNamed: "GameScene")
let skView = self.view as! SKView
scene?.scaleMode = .AspectFit
skView.presentScene(scene)
首先,您需要知道SKScene
和UIViewController
完全是两件事。 层次结构通常如下:
UIViewController
> UIView
( SKView
)-> SKScene
因此,将SKScene
呈现在可以是UIView
的SKView
中,然后将UIView
呈现在UIViewController
。
一旦了解了层次结构,一切就变得容易了。 有很多方法可以将不同的UIViewController
用于菜单和GameScene
。
方法一
例如,您可以具有RootViewController
, GameViewController
和MenuViewController
。 RootViewController
是应用程序启动时的初始ViewController。
在RootViewController
,您可以创建一个函数来显示GameViewController
:
func setupGameViewController() {
self.gameViewController = GameViewController()
self.addChildViewController(gameViewController!)
self.view.addSubview((gameViewController!.view)!)
gameViewController?.didMoveToParentViewController(self)
}
您需要为您呈现SKScene
在GameViewController
,我想你应该熟悉这一步。
然后,当需要显示菜单时,可以使用以下功能将MenuViewController
添加到RootViewController
:
func setupMenuViewController() {
self.menuViewController = MenuViewController()
self.addChildViewController(menuViewController!)
self.view.addSubview((menuViewController!.view)!)
menuViewController?.didMoveToParentViewController(self)
}
您还需要在此ViewController中显示menuView,我想您已经知道了。
还创建一个函数来关闭MenuViewController
:
func removeMenuViewController(){
self.menuViewController?.willMoveToParentViewController(nil)
self.menuViewController?.removeFromParentViewController()
self.menuViewController?.view.removeFromSuperview()
}
一切都完成了。
方法二
您还可以只有一个UIViewController
,但是可以将菜单创建为UIView
,然后可以使用self.view.addSuview(menuView)
展示菜单。 当然,您可以使用root视图,因为它是self.view as SKView
, self.view as SKView
仍然存在,但是没关系,因为它隐藏在menuView
的后面。
有关更新问题的注释
由于现场其实是无法删除的场景self.view as SKView
, self.view
是一个UIViewController的根本观点,它不能被删除。 如果您确实要删除场景(大多数情况下没有必要),则可以创建一个新的SKView
来展示您的SKScene
,然后在需要时通过self.view.addSubview(skView)
将此SKView
添加到UIViewController
。完全删除场景,只需使用skView.removeFromSuperview()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.