tvOS再入門

<p>以前、tvOSアプリケーション開発を試したことがあるが、あれから時間が経過したのと、tvOSのAdvent Calendarに投稿する機会に恵まれたということで、再挑戦することにした。幸い、他の投稿記事には入門的なものはないようなので、ちょうどいいと思っている。</p>

<p>tvOSのアプリケーションには二種類ある。従来型とクライアント-サーバ型だ。</p>

<p>後者はメディアのストリーミングを行うアプリケーションで従来のWeb技術を活用するものだ。マークアップ言語のTVMLでインターフェイスを実装し、JavaScriptで挙動を記述する。TVMLKitフレームワークはネイティブコードとの橋渡しをするものだ。</p>

<p>この投稿では、前者の従来型を取り上げる。Swiftで実装するアプリケーションだ。</p>

<p>サンプル・アプリケーションを用意したので、これを使って説明する。独自のコンテナViewControllerを使って画面を切り替えている。</p>

<img width="305" alt="コンテナビューコントローラ.png" src="https://qiita-image-store.s3.amazonaws.com/0/12540/341fcbc2-2255-facb-996c-56b71557136d.png">

<p>ContainerViewControllerは子となるViewControllerをインスタンス変数で保持する。</p>

<pre><code>class ContainerViewController: UIViewController {
    var titleViewController: TitleViewController?
    var gameViewController: GameViewController?
</code></pre>

<p>Storyboardから子となるViewControllerを取得し、子ViewControllerに親となるコンテナViewController を設定する。</p>

<pre><code>    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
</code></pre>

<p></p>コンテナビューコントローラに子ビューコントローラを登録。

<pre><code>        self.addChildViewController(titleViewController!)
        self.addChildViewController(gameViewController!)
        titleViewController!.didMove(toParentViewController: self)
        gameViewController!.didMove(toParentViewController: self)
</code></pre>

<p>最初に表示するViewControllerを設定する。</p>

<pre><code>        selectedViewController = titleViewController
        self.view.addSubview(selectedViewController!.view)
</code></pre>

<img width="305" alt="タイトル.png" src="https://qiita-image-store.s3.amazonaws.com/0/12540/06cfc7a7-e3e2-5c73-2203-ba11230ce4d1.png">

<p>タイトル画面でStartボタンが選択されるとコンテナViewControllerの画面遷移メソッドを呼ぶ。</p>

<pre><code>class TitleViewController: UIViewController {
    var containerViewController: ContainerViewController?
    
    :
    
    @IBAction func startButtonTapped(_: AnyObject) {
        containerViewController!.toGameViewController()
    }
}
</code></pre>

<p>コンテナViewControllerのコードは以下のとおり。</p>

<pre><code>    func toGameViewController() {
        transition(from: titleViewController!, to: gameViewController!, duration: 1.0, options: .transitionCrossDissolve, animations: nil, completion: { (finished: Bool) -> Void in self.selectedViewController = self.gameViewController })
    }
</code></pre>

<p>遷移したゲームViewControllerはSpriteKitを使ってゲーム・シーンを表示している。</p>

<pre><code>class GameViewController: UIViewController {
    var containerViewController: ContainerViewController?
    var game: Game?

    override func viewDidLoad() {
        print(NSStringFromClass(type(of: self)), #function)
        super.viewDidLoad()
        
        game = Game()
        if let aGame = game {
            let scene = aGame.scene
            scene!.scaleMode = .aspectFill
            
            let skView = view as! SKView
            skView.presentScene(scene)
            skView.ignoresSiblingOrder = true
            skView.showsFPS = true
            skView.showsNodeCount = true
        }
    }
</code></pre>

<p>tvOSはiOSから派生しているということで、iOSと同様に記述できている。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/tvos/Pokopen">https://github.com/murakami/workbook/tree/master/tvos/Pokopen</a> - GitHub<br />

関連情報
<a href="https://developer.apple.com/jp/documentation/General/Conceptual/AppleTV_PG/index.html">tvOSアプリケーションプログラミングガイド</a><br />
<a href="https://qiita.com/advent-calendar/2017/tvos">tvOS Advent Calendar 2017</a><br />
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />