在 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
,但是您确定不能只使类符合UITableViewDelegate
和UITableViewDataSource
吗?我不是说这会起作用,但我写了一些示例代码,我就是这样做的,它没有显示任何错误
只需将 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