トップ «前の日記(2017-12-08) 最新 次の日記(2017-12-10)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|

2017-12-09 [tvOS]tvOS再入門

以前、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?
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 } }

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

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/tvos/Pokopen - GitHub

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
Qiita

トップ «前の日記(2017-12-08) 最新 次の日記(2017-12-10)» 編集