What's New in Cocoa Touchでこんなことをテンション高めに言っていました。
Biggest SDK Release!!
ということでViewController関連がかなり変わったみたいなので、WWDC2014のセッションは必ずチェックしておくべきでしょう。
What's New in Cocoa Touch
なお、ビデオで触れられていない内容には踏み込まないようにしています(一部その他のセッション内で触れられていたことを補足として書いています)。
Adaptivity
キーワードはAdaptivityらしいです。"適応性"とか訳すのでしょうか。
先日発売されたiPhone6,iPhone6 Plusなど、これから種類が増えるであろうiOSの様々な端末に対応させるための施策とみられます。Autolayoutも数年前からレコメンドされていて着々と地盤固めを行っていたという見方もできます(個人の意見です)。
AdaptivityはDesign Philosophyであると言っていました。iPhoneとiPadでコードを再利用し、シームレスな開発をできるようにするための設計のようです。
UISplitViewController
がiPhoneでも使用可能になったあたりは最も特徴的なことと言えるのではないでしょうか。iPhone6 Plusでの横画面表示は個人的にも重宝しています。いろいろなiPhoneアプリがそのうち横画面にも対応してくるのではないでしょうか。
他にもiPhoneとiPadで、それぞれモーダルとポップオーバーで表示するViewControllerを使いますことができたり、UITableViewCell
がデフォルトでDyamic Typeに対応していたり、今回の目玉とも言えるExtensions
もCocoa Touchに関連する内容です。
App Extensionsについては日本語のドキュメントを読んだ際にメモしたものをこちらにまとめたのでよかったらどうぞ。
Interface orientation
iOS8から回転制御関連のAPIが軒並み"deprecated"になっています。
deprecated(一部です)
willRotateToInterfaceOrientation:duration:
willAnimateRotationToInterfaceOrientation:duration:
didRotateFromInterfaceOrientation:
interfaceOrientation
iOS8からSize Class
というものが新しい概念として登場しています。デバイスの向きではなくキャンバスサイズでデバイスの向きを区別します(下の図のデバイスサイズはかなり適当です)。
Size Class
ざっくりと説明するとiPhone = Compact、iPad = Regularです(正確には下の図を見てください)。Size Class
はhorizontal
とvertical
、つまり縦方向、横方向にそれぞれ定義を持ちます。
注意すべき点として、iPhoneはLandscapeの際のWidthはCompactですが、iPhone6 PlusだけはRegularになります。
図の右下はSplitViewController使用時のパターンです。左ペイン=masterの縦がRegular Height
、横がCompact Width
となっています。iPhone6 Plusの場合はHeightがCompactになります。
回転系のAPIがdeprecatedになった代わりにこちらのメソッドを使用してView Controllerのサイズの変更をキャッチするようです。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
UISplitViewController
今後使用頻度が増しそうなUISplitViewController
。iPhoneでもiPadでも使用可能になったのでUniversalアプリを開発するときにとても重宝しそうです。
What's New in Cocoa Touchではあまり詳しくは触れられていなかったので、View Controller Advancements in iOS 8を見ると良いと思います。
UISplitViewController
を使用してiOS8用Universalアプリを開発しているのですが、かなりシームレスに開発ができます。個人的な感想としてはやはりSize Class
を理解することが、このAPIを生かすための近道だと思います。
工夫をすればiPhone6 Plus以外でもSplitViewController
の見た目をiPadのようにすることができます(Size Classを書き換えてしまえば可能)。
Adaptive Presentations, Adaptive Alerts
presentViewController:animated:completion:
でモーダル表示させていたViewControllerも大きく変わりました。iPhoneのモーダル表示もiPadのpopover
もこのPresentation View Controller
に包括されるようになりました。
また、UIAlertView
やUIActionSheet
が"deprecated"になり、UIAlertController
にまとめられました。こちらもSize Class
の恩恵でAdaptive
にiPhoneとiPadで表示が変わります。
この辺の話が広がってしまうので詳しいところはA Look Inside Presentation Controllersを見ると良さそうです。
Testing with the iOS Simulator
とっくにご存じかと思いますが、シミュレーターに"Resizable iPad"、"Resizable iPhone"が追加されています。これできちんと表示が行われるか確認しましょう。
ただ、iPhone6が出た今となってはやはりシミュレーターもiPhone6で確認するのが良いと思います。あまりResizableのシミュレーターを使う必要はないと思います。
Visual Effects
UIVisualEffectView
が追加され、iOS7から導入された、いわゆるすりガラス効果が実装可能になりました。スクリーンショットとってぼかし効果をつけたりしなくて良くなりました。
ただ、やはりレンダリング時に結構パワーを使うみたいなので使いどころは考えた方が良さそうですね。Creating Custom iOS User Interfacesで詳しく解説されています。
Image Assets
これまでもRetinaか非Retinaの違いがありましたが、画像についてもSize Class
の概念が導入されています。Compact
とRegular
で使用する画像を使い分けたいときに別の画像を用意しておけば以下のように取り出すことができます。
let image : UIImage = UIImage(named: "image", inBundle: nil, compatibleWithTraitCollection: self.traitCollection))
traitCollection
にはhorizontalSizeClass
、verticalSizeClass
と言ったプロパティがあるので、ここから現在のSize Class
を参照できます。
Condensing Bars
"Condense"は「凝縮する」とか「圧縮する」という意味です。UINavigationController
にプロパティがいくつか追加されていてSafariのような動きが可能になっています。
詳しくはView Controller Advancements in iOS 8を見てください。
Self-sizing Table Cells
tableView:heightForRowAtIndexPath:
を使わずにセルの高さが調整可能になりました
。
iOS7からDynamic Typeが導入されましたが、iOS8からビルトインのアプリはすべてDynamic Typeに対応するようになっています。
※iOS8でフォントサイズを大きくしたときに自分のアプリがどんな風に表示されるか必ずチェックした方が良いと思います。
AlertController
などは、文字の大きさによってレイアウトが変わったり改行位置が変わったりするので要確認です。
詳しくはWhat's New in Table and Collection Viewsで説明されています。
App Extensions
iOS8の目玉であるExtension
。Photos
、Sharing
、Widgets
、Actions without UI
、Document providers
、Custom keyboards
など。
詳しくはCreating Extensions for iOS and OS X、Part 1とCreating Extensions for iOS and OS X、Part 2で説明されています。さすがに目玉なので2本立てです。
先日日本語のドキュメントが公開されました。読んだ際にメモしたものをこちらにまとめたのでよかったらどうぞ。
Notification Updates, Document Picker
Notificationに詳しくないのでよくわかりませんが、いろいろ強化されたようです。結構拍手が多かったので開発者たちからも好評のようです。
What's New in iOS Notificationsで詳しく説明されています。
Remote Notification
はデバイストークンを取得する際のメソッド自体が変わっているので、iOS7とiOS8を共存させる際は対応が必要です。
UIDocumentPickerViewController
はローカル、iCloud、サードパーティーのドキュメントを表示できるそうです。UIImagePickerController
のドキュメント版?
Building a Document-based Appで詳しく解説されているそうです。
まとめ
"What's New in Cocoa Touch"はこの後も続きますが、View Controllerまわりに関してはこんなところです。
個人的に大事だと思ったのはUISplitViewController
です。これの使い方が分かっているとUniversalアプリがかなり開発しやすくなると思います。うまくUIを共存させられれば余計なリソースを割かずに開発できます。
最も大きな変更はSize Class
の導入だと思います。Size Class
がAPI大幅変更にかなりの影響をもたらしています。
各デバイスごとのSize Class
を把握し、適切なUIを選択することが求められると思います。