Más contenido relacionado Similar a tvOSとiOSがこんなに違うわけがない ~tvOSアプリ実装編~ (20) tvOSとiOSがこんなに違うわけがない ~tvOSアプリ実装編~2. 自己紹介
• 辰己 佳祐 (23)
• 所属 – 株式会社CyberZ OPENREC事業部
• 職種 – エンジニア
(主にOPENREC.tvのiOS, tvOS担当)
• 755 – たつみんのFRESH!トーク
• 趣味 – お菓子作り, 沖縄三線
• アプリ – AppStoreで「Keisuke Tatsumi」で検索求ム
19. どうしてダメなのか > <
1. AppleTVにはステータスバーの概念が無い
から
2. AppleTVにはマルチタスキングのようなスプ
リットビューの概念が無いから
21. どうしてダメなのか > <
1. AppleTVにはステータスバーの概念が無い
から
2. AppleTVにはマルチタスキングのようなスプ
リットビューの概念が無いから
3. テレビは回転を検知できないから
22. どうしてダメなのか > <
1. AppleTVにはステータスバーの概念が無い
から
2. AppleTVにはマルチタスキングのようなスプ
リットビューの概念が無いから
3. テレビは回転を検知できないから
つまり
スクリーンのフレームサイズが1パターン(ランドスケープで全画面)
しかないので、applicationFrameを使う必要がなくなる
Notas del editor では、まずは「はじめに」から、 2015年12月にOPENREC.tvはAppleTVに対応しました!(拍手)
AppleTVに対応するにあたって、プロジェクトのメンバーの一人として僕も実装を担当させていただきました。
その経験を踏まえ、今回は実際に実装してみてわかったtvOSのアプリ開発はiOSと比べてここが違う!と感じたことについて発表します tvOSのアプリ開発では、iOSのときに使っていた操作方法であるタップ、スワイプ、パン、ピンチ(Appleでは不可) 、ドラッグ(AppleTVでは不可)に加えて、
フォーカスという概念がとても重要な特徴の一つとなっています AppleTV第四世代の新しいリモコンである Siri Remote ではTouchサーフェスによるトラックパッドのようなカーソル移動がメインになっているため、いまどこにカーソルがいるのかを判断するためにフォーカスの概念が導入されています。
なので、UIを設計する際は各UIパーツがフォーカスを検知できるのかどうかを知っておく必要があります。 現時点で、tvOSのUIKit内でフォーカスを検知できるUIパーツは・・・の7種類です。
また、フォーカスが当たっているビュー上に設置した UIImageView オブジェクトは adjustsImageWhenAncestorFocused プロパティをYESにすると、フォーカスが当たった際にサイズが自動的に大きくなり、スワイプに応じたパララックスの動きが付与されます。フォーカスが当たらないビューには非常に便利なプロパティなのですが、指定できるのはUIImageViewだけです。 続いて、各ビューにフォーカスが当たったときに呼ばれるのが UIFocusEnvironment プロトコルの - (void)didUpdateFocusInContext:withAnimationCoordinator: メソッドです。context.nextFocusedViewは現在フォーカスが当たっているビューを、context.previouslyFocusedViewは一つ前にフォーカスが当たっていたビューを取得することができます。
UIFocusEnvironment は UIView クラスや UIViewController クラスで定義されているため、そのサブクラスであれば、このメソッドでフォーカスの移動を検知できます。 iOSではデバイスに応じたスクリーンサイズを取得する際に、UIScreenクラスから bounds と applicationFrame という2つのプロパティが使えましたが、tvOSでは後者の applicationFrame が使えなくなりました。 実際に使おうとすると、このようにエラーが出ます。 また、UIKit.framework内にもtvOSでは使用禁止という指定がされています。
iOSの開発でこのapplicationFrameが使えないとなると、OPENREC.tv Ver.4.0で対応したiPad対応がまともにできない状況になってしまいます。
恐ろしい!では、どうしてapplicationFrameプロパティが使えないのでしょうか?理由は大きく3つあります。 このようにことごとく、statusBar関連のプロパティが使えなくなっています。 これはAppleTVにはまだありません。 まあ、テレビを使ってる時に回転させることって無いですよね? つまり、スクリーンのフレームサイズが1パターン(ランドスケープで全画面)しかないので、applicationFrameを使う必要がなくなるのです。
しかし、今後AppleTVでマルチタスキングが実装されたときには、applicationFrameは復活してもらわないと困りそうですね。 iOSアプリの開発ではボタンを押したときのアクションを実装するときに、よくこのようなコードで実装します。 フォーカスの違いはあれど、iOSでのボタンを押し込むタップと同じく、ボタンをクリックするという概念はtvOSでもおなじはず!
そう思って同じコードで実装してみました。すると、クリックしても、 何かおかしいと思って、UIKitの中身を覗いてみると、forControlEventsのオプション指定に新たな項目が増えていました。それが、 UIControlEventPrimaryActionTriggered というより長い名前になったオプションです。英語の意味から察するに、そのクラスの主なアクションを引き起こすためのオプションのようですね。あらゆるアクションを包括的に検知できるということかな?と考え、これを使ってみると、一発で反応しました! なので、tvOSでボタンを押したときのアクションを実装する際にはこのように書きましょう。