その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

iOS 9 の新機能のサンプルコード集『iOS-9-Sampler』を公開しました

iOS 9 でも大量の新機能が追加されましたが、新しいAPIはどう使うのか、実際に何がどこまでできるのか、といった具体的なところが、英語のドキュメントや動画をながめているだけだと正直あまりピンときません。やはり実際にコードを書いて動かしてみるのが一番わかりやすい・・・ということで今年もつくりました!


iOS-9-Sampler



恒例の iOS 9 新機能のサンプルコード寄せ集めアプリです。ソースコードは GitHub に置いてあるので、ご自由にご活用いただけると幸いです。


使い方は Xcode 7 でビルドするだけ なので、デザイナーさんやディレクターさんもぜひお近くのエンジニアにビルドしてもらってください。



Swift のバージョン 2.0 やオープンソース化、ついにネイティブ対応する watchOS 2、といったわかりやすい進化に対し、かなり成熟してしまったからかあまり期待の声を聞かない(気がする) iOS 9 ですが、こうやってサンプルをつくりはじめてみると、「Search APIs」や「Content Blocker」、「3D Touch」といった話題に登りやすい機能以外にも、意外とおもしろい新機能がたくさんあると思うようになりました。


今のところ21個のサンプルが入っています。随時追加していきます。機能追加プルリク大歓迎です!


以下各サンプルの紹介です。

Map Customizations

マップタイプで新たに指定できるようになった Flyover や、交通渋滞情報を表示する `showsTraffic` 等のサンプルです。



特に Flyover は、Appleの「Maps」アプリでは以前から登場していたものの、サードパーティ製アプリで使えるようになったのは今回からで、下記のようにプロパティをセットするだけで、

mapView.mapType = MKMapType.SatelliteFlyover
mapView.mapType = MKMapType.HybridFlyover


こんな感じのインパクトのある3Dマップ表示が可能となります。


Flyover Map for iOS 9.

Text Detector

CIDetector で新たに指定できるようになった `CIDetectorTypeText` を用いた文字認識のサンプル。



緑色の枠が検出した文字領域を示していて、(見づらいですが)黄色の枠は個々の文字領域を示しています。


2種類の画像への処理結果を比較してみると、同じステッカーを認識させるにしても、下の画像のようにパースがかかって陰影もある場合はグッと精度が落ちる(台形補正や二値化等の前処理をする必要がある)ことがわかります。


本機能については下記記事でも解説しています。

New Image Filters

CIFilter に追加された新しいフィルタのうち、静止画に対してかけられるものを試せるサンプル。



※今のところ29のフィルタを試せますが、`CISpotLight` については正常に機能していません。filterAttributes 等も確認したのですが改善方法は不明。プルリクお待ちしております。


先日のスライド にも書いたとおり、今回のアップデートは Core Image (CIFilter)にとっては久々の大幅アップデートなので、このサンプルも見応えがあります。

Audio Unit Component Manager

新クラス AudioUnitComponentManager を使用して利用可能な Audio Unit Extension Component のリストを抽出し、サウンドに動的に適用するサンプル。



iOSデバイスに Audio Unit Extensions が入っていれば、それらも抽出されます。


右上の「ShowAUVC」ボタンは、選択中の Audio Unit Extension Component が画面(`AUViewController` を継承したクラス)を持っている場合に有効になります。

Speech Voices

「私は寿司が好きです」という文を世界各国の言語の合成音声でしゃべらせるサンプル。


CASpringAnimation

CASpringAnimation を用いたばね風アニメーションのサンプル。



下記記事を参考にさせていただきました。

UIStackView

UIStackView によりビューを追加しても自動的にレイアウト調整される、というサンプル。


Selfies & Screenshots

Photos フレームワークに追加されたサブタイプ、`PHAssetCollectionSubtype.SmartAlbumSelfPortraits` と`PHAssetMediaSubtype.PhotoScreenshot` を利用し、フォトライブラリからセルフィー(自撮り)画像とスクリーンショットを抽出するサンプル。



下記記事を参考にさせていただきました。

String Transform

地味だけどちょっとおもしろい新機能 "String transliteration"(字訳、音訳という意味らしい)のサンプル。



上はひらがなをカタカナに、また全角を半角に変換するサンプルで、下は "Hello, world!" をハングルやアラビア文字等の各種言語の文字に変換するサンプルです。


後者の言語(文字)の置き換えですが、翻訳ではなくあくまで字訳なので、たとえば `NSStringTransformLatinToHiragana` を指定した場合、"Hello, world!" の変換結果は 「へっろ、をるるで!」になります。実用的なのか何なのかよくわからない機能ですが、海外に行くと意味はわからずともとにかく読みたい、という場面もある(メニュー名とか)ので、需要はあるのかもしれません。


下記記事を参考にさせていただきました。

Core Image Transitions

CIFilter の `CITransitionCategory` に追加された3つのトランジションエフェクト用フィルタ、

  • `CIRippleTransition`
  • `CIPageCurlTransition`
  • `CIPageCurlWithShadowTransition`

を利用したカスタム画面遷移エフェクトのサンプル。



Core Image をカスタム画面遷移エフェクトに利用する方法についての詳細は下記記事・スライドも併せてご参照ください。


Search APIs

Search APIs のサンプル。NSUserActivity を使うものと、Core Spotlight を使うものの2種類が実装してあります。


Content Blockers

Content Blocker Extensions のサンプル。



下記記事を参考にさせていただきました。

SFSafariViewController

SFSafariViewController で WEB ページを開くシンプルなサンプル。


Attributes of New Filters

iOS 9 から、CIFilter の filterAttributes で取得できる属性情報のキーに `kCIAttributeFilterAvailable_iOS` というものが加わりました。このフィルタは iOS 8 から使えるようになったよ、とかそういう情報を示す属性です。本サンプルではこの属性を用いて iOS 9 で新規追加されたフィルタ 41 種類 を抽出し、その属性情報を表示しています。



CIFilter の新しいフィルタはすぐにはドキュメントに反映されなかったりするので、そういう場合にこの一覧が役立ちます。


関連記事:

Low Power Mode

iOS 9 から加わった「Low Power Mode」設定。これをアプリからon/offすることはできないのですが、設定変更を検知することはできます。そのサンプル(地味なのでスクショはなし)

New Fonts

iOS 9 で新規追加されたフォント 31 種類のサンプル。



iOS 8 のときは新規追加フォントはたったの7種類だったので、ひさびさの大幅追加ではないでしょうか。

Contacts

iOS 9 で新規追加された Contacts framework のサンプル。



manhattan918 さんより pull request いただきました。

ReplayKit

iOS 9 で新規追加された ReplayKit framework のサンプル。


下記のような非常に簡単なコードで

private let recorder = RPScreenRecorder.sharedRecorder()
recorder.startRecordingWithMicrophoneEnabled(true) { [unowned self] error in
}


こんな動画スクリーンキャプチャを録ることができます。



Contacts サンプルに引き続き、manhattan918 さんより pull request いただきました!

Quick Actions (3D Touch)

ホーム画面のアイコンを強タップすると出てくる例のメニューのサンプル。(要 3D Touch



実装は Info.plist の `UIApplicationShortcutItems` キーと、AppDelegate の `application:performActionForShortcutItem:completionHandler:` メソッドにあります。

Force Touch (3D Touch)

3D Touch の押す強さを可視化するサンプル。マルチタップ可。UITouch に新規追加された `force` と `maximumPossibleForce` プロパティを使用。(要 3D Touch


Live Photos

iOS 9.1 で追加された `PHLivePhoto` と `PHLivePhotoView` を使用してライブフォトを表示するサンプル。



こちらに実装の解説記事を書きました。

おわりに

watchOS 2 のサンプル集はこちら!正式リリースされたらスクリーンショットを貼っていきます。