从 SKScene 呈现 UIViewController 显示黑屏

Posted

技术标签:

【中文标题】从 SKScene 呈现 UIViewController 显示黑屏【英文标题】:Presenting a UIViewController from SKScene shows black screen 【发布时间】:2017-01-27 09:31:39 【问题描述】:

此代码旨在向用户显示UIViewController“菜单”,而是以黑屏迎接他们。

let currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController!
let mymenu = menu()
currentViewController.present(mymenu, animated: true, completion: nil)

我正在从 SKScene 转换。

【问题讨论】:

【参考方案1】:

要从另一个SKScene 呈现SKScene,您应该这样做:

let nextScene = MainScene(size: self.scene!.size)
self.scene?.view?.presentScene(nextScene, transition: SKTransition.doorway(withDuration: 1))

您无需检索您的currentViewController,因为您始终可以访问您的sceneview


正如下面的 cmets 所解释的,有多种方法可以调用实现到游戏 viewController 的函数,其中一种可能是创建一个 delegate/protocol,如下代码所示:

GameScene 示例

import SpriteKit
protocol GameViewControllerDelegate: class 
    func callMethod(inputProperty:String)

class GameScene: SKScene 
    weak var gameViewControllerDelegate:GameViewControllerDelegate?
    override func didMove(to view: SKView) 
        gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
    

GameViewController 示例

class GameViewController: UIViewController, GameViewControllerDelegate 
    override func viewDidLoad() 
        super.viewDidLoad()
        if let view = self.view as! SKView? 
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "GameScene") 
                let gameScene = scene as! GameScene
                gameScene.gameViewControllerDelegate = self
                gameScene.scaleMode = .aspectFill
                view.presentScene(gameScene)
            
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        
    
    func callMethod(inputProperty:String) 
        print("inputProperty is: ",inputProperty)
    

输出

【讨论】:

但我正在转换到视图,而不是 SKScene。 您应该区分UIKit 元素和Sprite-kit 元素,尤其是在您使用游戏时。您也没有视图,但有一个包含 SKSceneSKView,因此您无法“转换”到视图 对不起,我不明白。我想在我的 SKScene 中调用一个函数,它会向玩家展示一个 uiviewcontroller。 啊,对了,那是另一个故事 :-) ,无论如何你可以在你的场景中展示玩家视图或任何其他UIKit 视图self.scene?.view?.addSubview(<your UIKit element>) 好的,抱歉,谢谢,但是如何向玩家展示 uiviewcontroller?

以上是关于从 SKScene 呈现 UIViewController 显示黑屏的主要内容,如果未能解决你的问题,请参考以下文章

从 SKScene 呈现后无法关闭视图控制器

从 SKScene 呈现 UIViewController 显示黑屏

如何在 SKScene 中呈现 UIViewController?

如何使用社交框架呈现来自 SKscene 的 UIViewController?

呈现 SKScene 后取消隐藏 UIButtons 时延迟?

斯威夫特:公共 Skscene 没有以文件名呈现?