SpriteKitでUITableViewを利用しカスタムセル
いつもお世話になっております。
SpriteKitでUITableViewを利用したいと考えております。
以下のサイトを参考にし、さらにセルをカスタマイズしたいと考えております。
以下のソースではセル内を「画像+タイトル+値段」で構成しております。
ですが、スクロールさせると画像やタイトルなどが、既存のセル上に次々に重なって新規に作成されてしまいました。
ご教授ご鞭撻のほどよろしくお願い致します。
他に良い方法がありましたらご教授頂けると幸いです。
参考サイト
https://stackoverflow.com/questions/41626348/using-a-uitableview-in-spritekit
■サンプルコード
import SpriteKit
import UIKit
...
override func didMove(to view: SKView) {
let tableView = TableView()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableView.frame = CGRect(x: 20, y: 50, width: 280, height: 200)
self.view?.addSubview(tableView)
tableView.reloadData()
}
...
class TableView: UITableView, UITableViewDelegate, UITableViewDataSource {
private var itemTitle = ["Cell 1", "Cell 2", "Cell 3", "Cell 4", "Cell 5", "Cell 6", "Cell 7", "Cell 8", "Cell 9", "Cell 0"]
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")
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return itemTitle.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let padding: CGFloat = 5.0
let cellWidth = tableView.frame.size.width - padding
let cellHeight = cell.frame.size.height - padding
let image = UIImage(named: "spaceship")
let ratio = cellHeight / (image?.size.height)!
let imageView = UIImageView(
frame: CGRect(
x: 0.0 + padding,
y: 0.0 + padding,
width: ((image?.size.width)! - (padding * 2)) * ratio,
height: ((image?.size.height)! - (padding * 2)) * ratio))
imageView.image = image
cell.addSubview(imageView)
let label = UILabel(
frame: CGRect(
x: imageView.frame.maxX,
y: imageView.frame.minY,
width: cellWidth - imageView.frame.maxX,
height: cellHeight))
label.text = self.itemTitle[indexPath.row]
cell.addSubview(label)
let price = UILabel(
frame: CGRect(
x: imageView.frame.maxX,
y: imageView.frame.minY,
width: cellWidth - imageView.frame.maxX,
height: cellHeight))
price.text = "100"
price.textAlignment = .right
cell.addSubview(price)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("Cell Value : \(itemTitle[indexPath.row])")
}
}