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

[What's New in Cocoa Touch](https://developer.apple.com/videos/wwdc/2014/#202)でこんなことを**テンション高め**に言っていました。

> **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については日本語のドキュメントを読んだ際にメモしたものを[こちら](http://qiita.com/mo_to_44/items/1f9147e6eb18f51937af)にまとめたのでよかったらどうぞ。

## 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になります。**

![SizeClassについて.png](https://qiita-image-store.s3.amazonaws.com/0/45525/636be2b5-97dd-eeeb-d790-eafbd822bcf4.png)


図の右下はSplitViewController使用時のパターンです。左ペイン=masterの縦が`Regular Height`、横が`Compact Width`となっています。iPhone6 Plusの場合はHeightがCompactになります。

回転系のAPIがdeprecatedになった代わりにこちらのメソッドを使用してView Controllerのサイズの変更をキャッチするようです。

```objc
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
```

## UISplitViewController

今後使用頻度が増しそうな`UISplitViewController`。iPhoneでもiPadでも使用可能になったのでUniversalアプリを開発するときにとても重宝しそうです。

[What's New in Cocoa Touch](https://developer.apple.com/videos/wwdc/2014/#202)ではあまり詳しくは触れられていなかったので、[View Controller Advancements in iOS 8](https://developer.apple.com/videos/wwdc/2014/#214)を見ると良いと思います。

`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`にまとめられました。](http://qiita.com/mo_to_44/items/8cfa139c6f38ba3ab3d2)こちらも`Size Class`の恩恵で`Adaptive`にiPhoneとiPadで表示が変わります。

この辺の話が広がってしまうので詳しいところは[A Look Inside Presentation Controllers](https://developer.apple.com/videos/wwdc/2014/#228)を見ると良さそうです。

## Testing with the iOS Simulator
とっくにご存じかと思いますが、シミュレーターに"Resizable iPad"、"Resizable iPhone"が追加されています。これできちんと表示が行われるか確認しましょう。

ただ、iPhone6が出た今となってはやはりシミュレーターもiPhone6で確認するのが良いと思います。あまりResizableのシミュレーターを使う必要はないと思います。

## Visual Effects

`UIVisualEffectView`が追加され、iOS7から導入された、いわゆるすりガラス効果が実装可能になりました。スクリーンショットとってぼかし効果をつけたりしなくて良くなりました。

ただ、やはりレンダリング時に結構パワーを使うみたいなので使いどころは考えた方が良さそうですね。[Creating Custom iOS User Interfaces](https://developer.apple.com/videos/wwdc/2014/#221)で詳しく解説されています。

## Image Assets
これまでもRetinaか非Retinaの違いがありましたが、画像についても`Size Class`の概念が導入されています。`Compact`と`Regular`で使用する画像を使い分けたいときに別の画像を用意しておけば以下のように取り出すことができます。

```swift:ViewController.swift
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](https://developer.apple.com/videos/wwdc/2014/#214)を見てください。

## Self-sizing Table Cells
`tableView:heightForRowAtIndexPath:`を使わずにセルの高さが調整可能になりました
。

iOS7からDynamic Typeが導入されましたが、iOS8からビルトインのアプリはすべてDynamic Typeに対応するようになっています。
※iOS8でフォントサイズを大きくしたときに自分のアプリがどんな風に表示されるか必ずチェックした方が良いと思います。

`AlertController`などは、文字の大きさによってレイアウトが変わったり改行位置が変わったりするので要確認です。

詳しくは[What's New in Table and Collection Views](https://developer.apple.com/videos/wwdc/2014/#226)で説明されています。

## App Extensions
iOS8の目玉である`Extension`。`Photos`、`Sharing`、`Widgets`、`Actions without UI`、`Document providers`、`Custom keyboards`など。

詳しくは[Creating Extensions for iOS and OS X、Part 1](https://developer.apple.com/videos/wwdc/2014/#205)と[Creating Extensions for iOS and OS X、Part 2](https://developer.apple.com/videos/wwdc/2014/#217)で説明されています。さすがに目玉なので2本立てです。

先日[日本語のドキュメント](https://developer.apple.com/jp/devcenter/ios/library/documentation/ExtensibilityPG.pdf)が公開されました。読んだ際にメモしたものを[こちら](http://qiita.com/mo_to_44/items/1f9147e6eb18f51937af)にまとめたのでよかったらどうぞ。

## Notification Updates, Document Picker
Notificationに詳しくないのでよくわかりませんが、いろいろ強化されたようです。結構拍手が多かったので開発者たちからも好評のようです。

[What's New in iOS Notifications](https://developer.apple.com/videos/wwdc/2014/#713)で詳しく説明されています。

`Remote Notification`はデバイストークンを取得する際のメソッド自体が変わっているので、iOS7とiOS8を共存させる際は対応が必要です。

`UIDocumentPickerViewController`はローカル、iCloud、サードパーティーのドキュメントを表示できるそうです。`UIImagePickerController`のドキュメント版？

[Building a Document-based App](https://developer.apple.com/videos/wwdc/2014/#234)で詳しく解説されているそうです。


## まとめ
"What's New in Cocoa Touch"はこの後も続きますが、View Controllerまわりに関してはこんなところです。

個人的に大事だと思ったのは`UISplitViewController`です。これの使い方が分かっているとUniversalアプリがかなり開発しやすくなると思います。うまくUIを共存させられれば余計なリソースを割かずに開発できます。

最も大きな変更は`Size Class`の導入だと思います。`Size Class`がAPI大幅変更にかなりの影響をもたらしています。

各デバイスごとの`Size Class`を把握し、適切なUIを選択することが求められると思います。