在 Spritekit 中使用 UITableView

Posted

技术标签:

【中文标题】在 Spritekit 中使用 UITableView【英文标题】:Using a UITableView in Spritekit 【发布时间】:2017-01-13 02:12:17 【问题描述】:

我目前遇到了问题。我正在创建一个游戏,我希望能够使用 UITableView 来显示数据(如关卡)。但是,我严格使用 SpriteKit,似乎无法让 UITableView 和 SpritKit 工作。

我尝试在我的“GameScene”类(这是一个 SKScene)中创建一个名为“gameTableView”的变量,并将其值设置为我创建的一个名为“GameRoomTableView”的类。

var gameTableView = GameRoomTableView()

该类的值是“UITableView”(请注意,我没有将它设置为 UITableViewController)。

class GameRoomTableView: UITableView 

我能够将 tableView 添加为我的 SKView 的子视图。我在我的 GameScene 类中的“DidMoveToView”函数中做到了这一点。在哪个视图中显示。

self.scene?.view?.addSubview(gameRoomTableView)

但是,我不知道如何更改部分的数量以及如何添加单元格。除非它是 viewController 并且我需要一个实际的 ViewController,否则该类不会让我访问这些类型的东西让它工作。我见过很多游戏使用 tableViews,但我不确定它们是如何工作的,哈哈。

如果您知道解决此问题的更好方法,请随时告诉我我做错了什么。如果您有任何问题,请告诉我。

【问题讨论】:

我从未尝试将UITableView 添加到SpriteKitScene,但是您确定不能只使类符合UITableViewDelegateUITableViewDataSource 吗?我不是说这会起作用,但我写了一些示例代码,我就是这样做的,它没有显示任何错误 只需将 UITableView 覆盖在与 SpriteKitScene 相同的空间之上,然后更改 .alpha 以显示/隐藏它? SpriteKit 的一个悲剧部分是它的 UI 前提/承诺与现实。使用分层在 SpriteKit 游戏之上的 AutoLayout 和 UIView 应该可以轻松创建关卡选择器。似乎没有人这样做过,并且没有可用的示例代码或其他演示表明了一些事情。 1.很少有人使用SpriteKit。 2. 在那些做过的人中,它还没有完成。因为 a) Apple 没有展示如何轻松做到这一点和/或 b) 它的性能很垃圾和/或 c) 完成它就像在不同的重力环境中跳过陀螺仪旋转的火焰箍 我不得不同意Confused。现在,我将在 SpriteKit 中使用自己的方式或仅使用 UIKit 可能混合 SpriteKit 和 UIKit UI 元素并不是 SpriteKit 游戏应该如何完成的想法。例如,在场景之间转换时,所有 UIKit 元素都应该被手动移除(释放,或至少隐藏),这在较大的项目中可能会很混乱。我的意思是它是可行的,但我个人避免它。希望 Apple 工程师将更多类似 UIKit 的有用元素添加到 SpriteKit 框架中。 【参考方案1】:

通常我不喜欢像您那样将UITableView 子类化,我更喜欢将UITableView 委托和数据源直接用于我的SKScene 类来控制表规格和数据到我的游戏代码。

但可能你有你的个人计划,所以我按照你的要求做一个例子:

import SpriteKit
import UIKit
class GameRoomTableView: UITableView,UITableViewDelegate,UITableViewDataSource 
    var items: [String] = ["Player1", "Player2", "Player3"]
    override init(frame: CGRect, style: UITableViewStyle) 
        super.init(frame: frame, style: style)
        self.delegate = self
        self.dataSource = self
    
    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    
    // MARK: - Table view data source
    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return items.count
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
        cell.textLabel?.text = self.items[indexPath.row]
        return cell
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return "Section \(section)"
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        print("You selected cell #\(indexPath.row)!")
    

class GameScene: SKScene 
    var gameTableView = GameRoomTableView()
    private var label : SKLabelNode?
    override func didMove(to view: SKView) 
        self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
        if let label = self.label 
            label.alpha = 0.0
            label.run(SKAction.fadeIn(withDuration: 2.0))
        
        // Table setup
        gameTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        gameTableView.frame=CGRect(x:20,y:50,width:280,height:200)
        self.scene?.view?.addSubview(gameTableView)
        gameTableView.reloadData()
    

输出

【讨论】:

这工作完美无缺,正是我想要的! 两年后这仍然按预期工作。谢谢!

以上是关于在 Spritekit 中使用 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Xcode 6 Playground 中使用 SpriteKit

在SpriteKit中使用平移手势识别器

如何在 spritekit 中使用页面控件? (以编程方式)

在 SpriteKit 中使用平移手势识别器

无法在 SpriteKit 中正确移动入侵者

在 SpriteKit 中呈现图像的最佳方式