Xcode
iOS
Swift

[WWDC2014] What's New in Cocoa Touchをまとめた 〜Size Class大事〜

More than 1 year has passed since last update.

What's New in Cocoa Touchでこんなことをテンション高めに言っていました。

Biggest SDK Release!!

ということでViewController関連がかなり変わったみたいなので、WWDC2014のセッションは必ずチェックしておくべきでしょう。

What's New in Cocoa Touch

なお、ビデオで触れられていない内容には踏み込まないようにしています(一部その他のセッション内で触れられていたことを補足として書いています)。

Adaptivity

キーワードはAdaptivityらしいです。"適応性"とか訳すのでしょうか。

先日発売されたiPhone6,iPhone6 Plusなど、これから種類が増えるであろうiOSの様々な端末に対応させるための施策とみられます。Autolayoutも数年前からレコメンドされていて着々と地盤固めを行っていたという見方もできます(個人の意見です)。

AdaptivityDesign 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 = CompactiPad = Regularです(正確には下の図を見てください)。Size Classhorizontalvertical、つまり縦方向、横方向にそれぞれ定義を持ちます。

注意すべき点として、iPhoneはLandscapeの際のWidthはCompactですが、iPhone6 PlusだけはRegularになります。

SizeClassについて.png

図の右下は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に包括されるようになりました。

また、UIAlertViewUIActionSheetが"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の概念が導入されています。CompactRegularで使用する画像を使い分けたいときに別の画像を用意しておけば以下のように取り出すことができます。

ViewController.swift
let image : UIImage = UIImage(named: "image", inBundle: nil, compatibleWithTraitCollection: self.traitCollection))

traitCollectionにはhorizontalSizeClassverticalSizeClassと言ったプロパティがあるので、ここから現在の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の目玉であるExtensionPhotosSharingWidgetsActions without UIDocument providersCustom keyboardsなど。

詳しくはCreating Extensions for iOS and OS X、Part 1Creating 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を選択することが求められると思います。