iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
以前、tvOSアプリケーション開発を試したことがあるが、あれから時間が経過したのと、tvOSのAdvent Calendarに投稿する機会に恵まれたということで、再挑戦することにした。幸い、他の投稿記事には入門的なものはないようなので、ちょうどいいと思っている。
tvOSのアプリケーションには二種類ある。従来型とクライアント-サーバ型だ。
後者はメディアのストリーミングを行うアプリケーションで従来のWeb技術を活用するものだ。マークアップ言語のTVMLでインターフェイスを実装し、JavaScriptで挙動を記述する。TVMLKitフレームワークはネイティブコードとの橋渡しをするものだ。
この投稿では、前者の従来型を取り上げる。Swiftで実装するアプリケーションだ。
サンプル・アプリケーションを用意したので、これを使って説明する。独自のコンテナViewControllerを使って画面を切り替えている。
ContainerViewControllerは子となるViewControllerをインスタンス変数で保持する。
class ContainerViewController: UIViewController {
var titleViewController: TitleViewController?
var gameViewController: GameViewController?
Storyboardから子となるViewControllerを取得し、子ViewControllerに親となるコンテナViewController を設定する。
override func viewDidLoad() {
super.viewDidLoad()
let mainStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
titleViewController = mainStoryboard.instantiateViewController(withIdentifier: "TitleViewController") as? TitleViewController
titleViewController!.containerViewController = self
gameViewController = mainStoryboard.instantiateViewController(withIdentifier: "GameViewController") as? GameViewController
gameViewController!.containerViewController = self
self.addChildViewController(titleViewController!)
self.addChildViewController(gameViewController!)
titleViewController!.didMove(toParentViewController: self)
gameViewController!.didMove(toParentViewController: self)
最初に表示するViewControllerを設定する。
selectedViewController = titleViewController
self.view.addSubview(selectedViewController!.view)
タイトル画面でStartボタンが選択されるとコンテナViewControllerの画面遷移メソッドを呼ぶ。
class TitleViewController: UIViewController {
var containerViewController: ContainerViewController?
:
@IBAction func startButtonTapped(_: AnyObject) {
containerViewController!.toGameViewController()
}
}
コンテナViewControllerのコードは以下のとおり。
func toGameViewController() {
transition(from: titleViewController!, to: gameViewController!, duration: 1.0, options: .transitionCrossDissolve, animations: nil, completion: { (finished: Bool) -> Void in self.selectedViewController = self.gameViewController })
}
遷移したゲームViewControllerはSpriteKitを使ってゲーム・シーンを表示している。
class GameViewController: UIViewController {
var containerViewController: ContainerViewController?
var game: Game?
tvOSはiOSから派生しているということで、iOSと同様に記述できている。