Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード

2017-06-27

iOSの技術書をクラウドファンディングで執筆します - 共著者8人の紹介 #peaks_cc

「PEAKS」という技術書のクラウドファンディングサービスで、今日から9人の執筆陣によるiOSの解説書「iOS 11 Programming」のファンディングが始まりました。


f:id:shu223:20170626233655j:image:w600



9人の著者陣に僕も入ってるので、宣伝といえば宣伝なのですが、技術書大好きな自分としては、自分が入ってなくても絶対に買うであろう執筆陣/内容なので、いち読者としてもぜひとも成立して欲しいと思ってまして、本記事を書こうと思った次第です。


そう、念のため書いておきますが、クラウドファンディングなので、成立しなければ出ません😭

購入締切日時 2017年07月28日 23:59 までに、購入者数が目標の 500人 に達した時点で執筆開始となります。購入額の決済は、目標人数が達成された時点で行われます。(目標人数に達しなかった場合はプロジェクト不成立となり、決済は行われません。)


ページ内の著者コメントにも書きましたが、僕がお世話になった著書の執筆者であったり、いつもお世話になってる著名オープンソースライブラリのコミッタの方であったり、いつも素晴らしい記事を書かれている方であったり。期待しかない布陣なのです。


万が一それが伝わってなくても悲しいので、僕「以外」の方々についておこがましいですが簡単に紹介させていただきたいと思います。以下サイトに載ってる順に。*1


吉田 悠一 - Core ML

通称ソンソン(sonson)さん。「iOS SDK Hacks」のメイン著者のひとり。


iOS SDK Hacks ―プロが教えるiPhoneアプリ開発テクニック
吉田 悠一 高山 征大 UICoderz
オライリージャパン
売り上げランキング: 226658


2010年とかなり黎明期に書かれた本ですが、Method Swizzling や Accelerate.framework といった他著では扱ってないトピックについて書かれていて、その後何年も本書を開いて参考にさせていただきました。


コンピュータビジョンや機械学習を専門とされていて、今回Core MLについて書かれるということで、ブログ記事や他著にありそうなチュートリアルをなぞってみた的なところを超えた、「中身がわかってる人ならではの解説」が非常に楽しみです。


池田 翔 - Swift 4の新機能とアップデート

通称いけしょーさん。あの Carthage、ReactiveSwift のコミッタであり、Himotoki の作者です。Carthageというパッケージマネージャ、ReactiveSwiftというリアクティブプログラミングをするためのライブラリ*2、Himotokiという「Swift自体がそのコアコンセプトを後追いすることになった」JSONパーサの中身をコミッタ・作者レベルで理解している人が解説するSwift 4、読みたすぎます。


坂田 晃一 - Xcode 9 の新機能

僕は坂田さんと呼んでますがID的にはhuinさん。今年出版された「モバイルアプリ開発エキスパート養成読本」の著者のひとり。


モバイルアプリ開発エキスパート養成読本
技術評論社 (2017-04-11)
売り上げランキング: 38,762


iOSDC等のカンファレンスや勉強会でよく発表されていて、わかりやすくてためになる内容に定評がある方です。


加藤 尋樹 - Drag and Drop / Files と Document Based Application

通称すこんぶさん。try! Swiftの記念すべき第1回目に登壇されていました。

上記はすこんぶさんのブログですが、技術記事はいつも他の記事には書いてない「一歩踏み込んだ」内容で、めちゃくちゃ勉強になります。


川邉 雄介 - UIKitのガイドラインの変更点とAutoLayoutの新機能、アップデート

僕は川邊さんと呼んでますが、ID的にはjeffsukeさん。「よくわかるAuto Layout」の著者の方です。



この本の紹介記事にも書きましたが、「こんなに詳しく、しかも噛み砕いててすごい」と驚く内容の良さでした。*3


ブログ記事もちょっと込み入った内容を綺麗に構造化してわかりやすく書くのが上手い方だなーと思います。


岸川 克己 - Core NFC / PDFKit / SiriKit

通称きしかわさん。きしかわさんです!Realm、try! Swiftの主催、色々な会社の技術顧問、KeychainAccessの作者等いろいろな顔がありますが、なんといっても岸川さんの勉強会等での登壇内容は、そのまま本にして欲しいぐらい詳しく、他で説明されてないような内容まで網羅されていて、それでいてわかりやすいです。


PEAKSクラウドファンディング第1弾は岸川さんの「Inside Swift」でしたが、ぜひとも成立して欲しい企画でした。目標部数が高すぎるからだ!と思わずPEAKSにアンケートでクレームを入れたぐらいでした😭


今回こそは成立させて、岸川さんの書く章を読みたいです。というか、「PDFKit」は何となく岸川さんが書きそうなイメージがありますが、「Core NFC」「SiriKit」というチョイスは個人的にはちょっと意外で、だからこそますます読んでみたい気持ちが高まります・・・!


所 友太 - HomeKit入門とiOS 11における新機能

僕は普通に「ところさん」と呼んでます。みんな持ってたあの「UIKit詳解リファレンス」を書いた方。


iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 355,345


「よくわかるAuto Layout」の監修でもあります。あと #potatotips の創始者でもあります。


「UIKit本の次回作は書かないんですか?」と会う度に聞いてて「今書いてます!」と言ってたのに7年経ってもまだ出てないので、こういう機会でもないとなかなか書いてくれない気がしますw 所さんのHomeKit解説、ぜひ読みたいです。


永野 哲久 - Audio/Media関連 新フレームワークとアップデート

iOSのオーディオまわりをいじる人はみんな参考にしたあの「iPhone Core Audioプログラミング」の著者。


iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 88,410


2009年刊行ですが、オーディオ周りの低レイヤのAPIのうちのいくつか(大部分)はこの本にしか書かれてないことが多く、一時期は1万円を超えるプレミア価格がついてました。プログラミング界隈においてはだいたいの情報は英語が源泉ですが、この本をネイティブで読めるので日本語できて良かったーとまで思った一冊です。


この企画の話をいただくまで知らなかったのですが、実はPEAKSの中の人はこの永野さん。今回の発起人でもあります。


おわりに

もしかしたら個人的な思いがほとばしりすぎて宣伝にすらなってないかもしれません。。プロジェクトが成立(=購入者数が目標数に到達)してから執筆される本なので、ある程度内容については著者陣を信用してほしいということになりますが、ガジェット系等のクラウドファンディングと違って成立しなければ決済されないので、"支払ったけど本(電子書籍or紙の本)は届かない"ということはないのでその点はご安心いただきつつ、気になった方はぜひ応援の購入をしていただければありがたいです。



よろしくお願いいたします🙇🏻



*1:なお、紹介に出てくる著書はもちろん全て個人的に所有しております

*2:こういうの何て総称するんでしょう?

*3:「わかりやすいけど内容が薄い」、または「内容は詳しいけど公式ドキュメントの直訳でわかりにくい」(著者が咀嚼できてない)、というパターンは実際にたまに見かける

2017-06-06

API Diffsから見る iOS 11 の新機能 #WWDC17

今年はWWDC会場よりお送りしております。特に何も期待しないまま参加したのですが、開発者的には非常にワクワクする発表がたくさんありました。


基調講演の内容からではなく、ベータ公開されたiOS Dev CenterのAPIリファレンスを見て、個人的に/開発者目線から気になった新APIを挙げていきます。


Core ML

iOS 10からMetal Performance Shaders(以下MPS)に追加されたCNN関連機能、足りないものが色々とあり、ここらへんは拡充されたら嬉しいなとは思っていましたが、新フレームワークとして登場しました。


おいおい、さらに増えたら MPSCNN / BNNS / Core ML とどう使い分けるんだ、と思いましたが、ドキュメントの図で棲み分けがわかりました。


f:id:shu223:20170606094137p:image:w450


Keras や Caffe で学習したモデルを BNNS や MPSCNN で使えるようにするのが Core MLのようですね。

import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
coreml_model.save('my_model.mlmodel')

実際、学習済みモデルを持ってくるところは扱いづらい仕様だったので、これは嬉しいです。



Metal Performance Shader

上でMPSという略語を何度かもう出しましたが、MPS自体にもいくつか新規追加APIがあります。その中でも目を引くのが Recurrent Neural Networks(RNN / 再帰型ニューラルネットワーク)関連のAPI群。

  • MPSRNNImageInferenceLayer
  • MPSRNNMatrixInferenceLayer
  • MPSRNNSingleGateDescriptor
  • MPSGRUDescriptor
  • MPSLSTMDescriptor
  • MPSRNNSequenceDirection

RNNは、文書解析に向いていて、自然言語処理の分野で成果を挙げているとか。勉強します。


Vision

これも新フレームワーク。画像解析・コンピュータビジョンで顔を識別したり、シーンを分類したりするフレームワークのようです。APIを見てると Core Image の CIDetector の下回りがこれなのかなぁという品揃えです。

  • Face Detection and Recognition
  • Machine Learning Image Analysis
  • Barcode Detection
  • Image Alignment Analysis
  • Text Detection
  • Horizon Detection
  • Object Detection and Tracking

ちなみにドキュメント冒頭で "detect faces" ではなく "identify faces" という言い方をしてるのと、"Face Detection and Recognition" とわざわざ書いてあるので、顔検出ではなく、「これは誰々だ」という顔の認識までしてくれるのかなと期待しましたが、今のAPIを見た限りだと従来の顔の矩形検出っぽいです。今のところは。


いや、それにしてもこれは嬉しいです。もっとAPI掘ってみます。


ARKit

これは基調講演でも盛り上がってましたねー *1


f:id:shu223:20170606094517p:image:w600


私事ですが、勤めている会社のアプリ Fyuse でこういうものを実装しました。


f:id:shu223:20170606094635j:image:w585


Fyuseというアプリはスマホで3D的な写真を取るアプリなのですが、実装した機能というのが、タップして選んだ対象の周囲に3Dの「ARガイド」を表示して、撮影を補助するものです。


f:id:shu223:20170606094825g:image


で、これがiOSの実装的に言うと、

  • カメラからの入力画像を解析してリアルタイムに物体追跡
  • カメラの姿勢と対象物体の位置・角度からARガイドを表示する

というところで、AVFoundation、Metal、SceneKit(+コアとなる画像処理:弊社リサーチチームによる実装)が要素技術になってきます。


僕は3Dの取り扱いにまだ慣れてなくて、カメラからの入力・iPhoneのスクリーンという2Dの世界と、デバイスの姿勢・SceneKitで構築する3Dの世界とを行き来するのに苦労しました。


こういうのをARKitはやりやすくしてくれるものなのかなと思います。具体的なAPIはまた後ほど見たいと思います。


Depth API

基調講演で「Depth API」って言ってて、「きたー!」と思いましたが、


AVFoundationを見るも、新規追加APIはなし


どこにあるのでしょうか・・・?


→ FacebookやTwitterで @hkato193 さん、@Gemmbu に教えていただいて、 AVCaptureDepthDataOutput という新規APIがあることがわかりました。(新しいドキュメントのdiffの見方を間違ってました)


Core Bluetooth on watchOS

Core Bluetooth が watchOS でも使えるようになったようです。



ドキュメント見ると、核となるクラスである CBCentralManager や CBPeripheralManager が "watchOS 2 +" となっていて、"4.0+" の間違いなのかほんとなのか謎ですが、いずれにせよ、時計から外部デバイスを操作できるって、ワクワクしませんか・・・?僕はします。またウォッチいじりたくなりました。


Core Bluetoothについて新たに勉強したくなった方にはこちらの書籍がおすすめです。


Core NFC

基調講演でチラッとNFCの文字が見えましたが、新フレームワークが追加されてました。何ができるようになったのか、あとでAPIを見ます。


→ その後FacebookでNoriaki Misawaさんより、以下のように情報いただきました。

CoreNFCはType1-5までのNDEFが読めるようになりました。それだけみたいです。コード書いて試そうとしたら、7じゃないとダメだそうで、それ知る前に6sをiOS11にしてしまったので焼き直しです。。


SiriKit

開発者ドキュメントでは"Lists and Notes"という、NotesやToDoリストを作成・管理するものが追加されてますが、基調講演では他にももっとたくさんできることが増えたって言ってたような。


その他

MusicKit

基調講演でチラッと行ってた気がするけどAPIリファレンスに見当たらないような。。。


いや、Musicライブラリまわりの連携って、実は結構苦しいこと多くないですか?なので、何が新たにできるようになったのかは知っておきたいなと。


→ FacebookでIkuya Omatsuさんより以下のように情報いただきました。

AppleMusicAPI Refならありました

(今日のWWDCのMusicKitのセッションのResourceリンクにもこれが貼られてました)


RPScreenRecorder(ReplayKit)

ReplayKitに追加された、アプリのスクリーンビデオを撮るためのクラス。そもそもReplayKitってそういうものじゃなかったでしたっけ?たまに画面を録画する機能をサクッとつくりたいケースはあるので、以前のと何が違うのか、見ておきたいなと。


→ コメント欄に @k_katsumi さんよりコメントいただいてるのでご参照ください。


SCNCameraController(SceneKit)

何をするものでしょうか?あとで見る。


NEHotspotConfiguration

WiFi関連のAPIが今更新たに公開されるのって、どういう文脈に沿ってるんでしょうか?何にせよ外の物理的な何かと連携するAPIは好物なので、見ておきたいです。


Xcode 9

いろいろ劇的に改善されましたね。


関連


*1:個人的には、ポケモンGoのARはあまりARの良さを活かしているものではないと思ってるので(みんなARモード切って使ってますよね)、あれがARの代表例としていつも挙げられる度にうーんと思ってしまうのですが

2016-09-14

iOS 10の新機能のサンプルコード集「iOS-10-Sampler」を公開しました

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


iOS-10-Sampler


f:id:shu223:20160914063446j:image:w600


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


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


f:id:shu223:20160914072119j:image:w600


iOSももうかなり成熟してしまい、話題になる革新的な新機能とか、どの開発者にとっても嬉しい新機能というのはなかなかないわけですが、実装してみると思ったより簡単なので自分のアプリにも取り入れたくなったとか、他の誰も話題にしてないけど自分的には熱いみたいな機能もあったので、ぜひ一度お試しいただけると嬉しいです。


また、Samplerシリーズでは「余計な実装を混ぜずに、新機能のメリットをできるだけシンプルな実装で伝える」というところに気をつけています *1。コピペもしやすいと思うので、自分のアプリに取り入れて動かしてみるとより楽しいかもしれません。


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


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


Speech Recognition

新たに追加された Speech Framework を利用した音声認識のサンプルです。


f:id:shu223:20160914070235j:image:w405


Appleのサンプルをベースに、全58種類の対応言語を選択する機能を追加しています。


Looper

AVFoundationに新規追加されたクラス AVPlayerLooper を用いた動画のループ再生のサンプルです。


f:id:shu223:20160914070311g:image:left f:id:shu223:20160914070308g:image



このクラス自体はプレイヤー機能は持っておらず、AVQueuePlayer と AVPlayerItem のインスタンス、そしてループする範囲を示す CMTimeRange オブジェクトを渡して使用します。

public init(player: AVQueuePlayer, templateItem itemToLoop: AVPlayerItem, timeRange loopRange: CMTimeRange)

Live Photo Capturing

写真撮影用に追加された新クラス AVCapturePhotoOutput を使用したライブフォト撮影サンプルです。*2


f:id:shu223:20160914070434j:image:w200


Live Photo のビューワーは iOS 9.1 から使えましたが、今回から撮影もできるようになりました。


Audio Fade-in/out

すごーく地味だし、このAPIがなくてもできたといえばできたことなんですが、実際に使う人は多いかもしれません。AVAudioPlayerにフォードイン/アウトするためのメソッドが追加されました。

// Fade In
player.setVolume(1, fadeDuration: 3)

// Fade Out
player.setVolume(0, fadeDuration: 3)

これタイマーとかでやってた人は嬉しいんじゃないでしょうか。


Metal CNN Basic: Digit Detection

Metal Performance Shaders フレームワークに追加されたCNN (Convolutional Neural Network / 畳み込みニューラルネットワーク)を用いた手書き数字認識のサンプルです。*3


f:id:shu223:20160914070517g:image


この「Metal AcceleratedなCNN計算処理」は個人的には今回一番熱い新機能です。



Metal CNN Advanced: Image Recognition

上のサンプルに引き続き、Metal Performance ShadersのCNNを利用したリアルタイム一般物体認識のサンプルです。*4


f:id:shu223:20160914070509g:image


速くて見づらいかもしれませんが、ノートパソコン(notebook)→ リモコン(remote control) → iPhone(iPod)と認識しています。


Metal ShaderというぐらいなのでGPUで処理されます。6s利用ですが、処理速度も申し分なしでした。(ちなみにMetalはAppleのハードウェアに最適化されたグラフィックスAPIで、「OpenGLより最大10倍速い」と言われています)


ちなみにミスリードもあるかもしれないので念のためですが、「一般物体認識」という新機能があるわけではないです。本サンプルで使用しているモデルはImageNetデータセットを用いてInception v3ネットワークをTensorFlowで学習させたもので、新機能はあくまで「Metal(GPU)でCNN処理」という部分になります。


PropertyAnimator: Position

アニメーション用の新クラス、UIViewPropertyAnimatorを用いて UIView オブジェクトの位置と、背景色をアニメーションさせるサンプルです。


f:id:shu223:20160914070727g:image


画面上をタッチしたままグリグリと動かしてみてください。touchMovedが呼ばれるたびにアニメーションが追加するという単純な処理をやっているのですが、いい感じに追随してくれるのが今回のクラスがアニメーションの追加をいい感じにやってくれてる *5 おかげなのかなと。


PropertyAnimator: Blur

UIViewPropertyAnimator の `fractionComplete` を用いて UIVisualEffectView / UIBlurEffect のブラーをアニメーションさせるサンプルです。


f:id:shu223:20160914070720g:image


やってることは超シンプルで、`effect` プロパティから UIBlurEffect を削除する処理を UIViewPropertyAnimator に登録しておいて、

animator = UIViewPropertyAnimator(duration: 0, curve: .linear) {
    self.effectView.effect = nil
}

スライダーの値に応じて `fractionComplete` を変化させています。*6

@IBAction func sliderChanged(sender: UISlider) {
    animator.fractionComplete = CGFloat(sender.value)
}

Preview Interaction

新クラス、UIPreviewInteraction で、3D Touchでピーク&ポップするサンプルです。


f:id:shu223:20160914070939g:image


Notification with Image

新しい通知のフレームワーク、UserNotifications framework を用いて、画像付きローカル通知を発行するサンプルです。


f:id:shu223:20160914033106j:image:w200:left f:id:shu223:20160914033113j:image:w200



Sticker Pack

iMessage のステッカーパックのサンプルです。


f:id:shu223:20160914032800j:image:w200


Messagesってメッセンジャーアプリとしてどれだけのシェアがあるの?という声も効きますが、ステッカーパックは画像をアセットカタログに入れていくだけの超超簡単実装なので、いい感じの画像を持っているアプリはやっといて損はないのかなと。


Core Data Stack

NSPersistentContainer を使うと Core Data の実装がシンプルになるよ、というサンプルです。


f:id:shu223:20160914034038j:image:w200


noliliさんよりpull requestいただきました!


TabBar Customization

UITabBarのバッジをカスタマイズするためのAPIが追加されました。*7


f:id:shu223:20160914034330j:image:w200


センスがなく、全然いい感じにカスタマイズできてないのが心残りですが。。


New filters

CIFilterで追加されたフィルタのサンプル。


f:id:shu223:20160914034350j:image:w200:left f:id:shu223:20160914034353j:image:w200



前回は豊作だったのですが、今回はちょっとしかありませんでした。。


New Fonts

新規追加されたフォントのサンプル。こちらも今回は少なく、4種だけ。*8


f:id:shu223:20160914034359j:image:w200


Proactive: Location Suggestions

NSUserActivityに新たに追加された `mapItem` プロパティを用いた "Location Suggestions" のサンプル。


f:id:shu223:20160914054654j:image:w200:left f:id:shu223:20160914071309j:image:w200



いわゆる「Proactive」というやつで、Appleから出てるサンプルがあるのですが、どの実装が何に効いているのか、というかこのサンプルをどう試すのか、というのがちょっとわからず(WWDCセッションをちゃんと見ればいいのかもしれませんが)、下記記事に助けられました。


Attributed Speech

AVSpeechUtterance に、NSAttributedStringを渡せるイニシャライザが新たに追加されたので、これを試すデモです。


NSAttributedString は文字列に色んな属性を指定できるわけですが、


これを音声合成の「Utterance」に渡せるということは、例えば、NSFontAttributeNameを用いてある範囲のフォントをboldにすると、その部分だけ強調されて発声されるとか、何か別の属性を使ってアクセントを制御できるとか、そういうことを期待したわけです。


が、結果は・・・何も起こりませんでした



同ツイートのメンションで岸川さんから `kCTLanguageAttributeName` で言語を切り替える、`kCTRubyAnnotationAttributeName` でルビをふる、といった文字列だけではなくて音声にも有用そうな属性を示唆いただきましたが、これらを試してみてもやはりあり/なしで違いは発声しませんでした。


何か私の実装が間違っているのかもしれませんし、プルリクをいただけるかもしれないので、サンプルとしては残してあります。


Haptic Feedback

iPhone 7のTapticEngineを利用するフィードバックのサンプルです。UI

ImpactFeedbackGenerator、UINotificationFeedbackGenerator、UISelectionFeedbackGeneratorの全てのパターンを試せます。


f:id:shu223:20170103172859j:image:w200


所感

箇条書きで。。

  • Notificationのカスタマイズ、ロック画面でプレビューは嬉しい
  • 標準で、ローカルで音声認識ができるようになったのも嬉しい
  • MPSCNNは熱いのでここはもっと勉強したい
  • iMessage app / Sticker Pack は当初まったく期待してなかったけど自分でやってみるとその簡単さとやっておいて損はない(親アプリがiOS 9でもok)という点で意外と熱い
  • UIViewPropertyAnimator、あまりワクワクするような新しさのあるものではなかったが、従来のものよりは便利なのでiOS 10以上のアプリでは普段使いすると思う
  • 3D TouchでPeek&Popは3D Touchデバイスが普及するまでは静観
  • Proactiveは今は静観
  • SiriKitは良いサンプルが思いつかず今回は入れなかった

デュアルカメラとか、Taptic Engine APIとか新デバイス系はまた後ほど。


おわりに

最初は個人的な勉強として始めたものがすっかり恒例になって、もうかれこれ4年もこれをやっています。


f:id:shu223:20160914061757j:image:w320


これがまぁなかなか大変で、それなりに時間がかかるので、周りの人には毎年「今年はやらないかも」とか毎年言ってて、なんだかんだやっぱり今年もつくってしまったという。







まぁ自分はやっぱり「新しいAPIが追加されると開発者としてできることが増える」のが好きなのと、(冒頭に毎年書いていることですが)自分で手を動かさないと全然理解できないというのがあるので、これはやっぱり続けた方がいいなと。


そんなわけで Apple Watch Series 2 が届いたら「watchOS-3-Sampler」もつくりたいと思います!


*1:Appleによる公式サンプルではアプリとしての体裁を整えるために新機能とは直接は関係ない実装がたくさん入っていたりしてややこしくなっているケースが多々ある

*2:Appleの「AVCam」サンプルをベースに、Live Photo撮影の実装だけを抜き出し、シンプルにしたもの

*3:本サンプルは、Appleの「MPSCNNHelloWorld」サンプルをベースに、不要な実装を除去しシンプルにしたもの

*4:本サンプルのモデルデータと、ネットワークの実装は、Appleの「MetalImageRecognition」サンプルをベースにしています

*5:WWDC16のセッション216でそんな感じのことを言ってました

*6:この手法は、こちらのコードで知りました: https://github.com/manuelCarlos/IOS10-Animate

*7:これらの追加APIについては、こちらの記事で知りました: [iOS 10] UITabBarのバッジを少しカスタマイズできるようになった - Qiita

*8:しかもFutura、AmericanTypewriterは従来からあるfamilyの太さ違い

2016-07-17

【書評】初学者はもちろん、中級者にもオススメのAuto Layout解説書

著者の川邉さん(@jeffsuke)および出版社のリックテレコム様より『よくわかるAuto Layout - iOSレスポンシブデザインをマスター』をご献本いただきました。


f:id:shu223:20160717140912j:image:h600


タイトルの通りAuto Layoutの解説書で、豊富な図やスクリーンショットを用いて、非常にわかりやすく書かれています。前書きによると、本書の対象読者は

過去一度はXcodeを用いてiOSアプリをつくったことがあるが、Auto Layoutとサイズクラスを用いたAdaptive Layoutと言われると尻込みしてしまう開発者

とのこと。


なんかもうベストセラーになったりしてるらしく、


AutoLayoutの必要性は今更僕が説くことでもないですし、監修は名著『UIKit詳解リファレンス』の著者 所さん


ということで、これはもう

  • iOSアプリ開発に携わっている(携わろうとしている)
  • AutoLayoutがよくわかってない

という方はもう買うしかないでしょう。買いましょう!



よくわかるAuto Layout  iOSレスポンシブデザインをマスター
川邉 雄介
リックテレコム
売り上げランキング: 14,747

(Kindle版もありますが、固定レイアウトのようです。)



・・・と、Auto Layoutに自信のない初学者の方には当然のようにオススメなのですが、AutoLayoutがそれなりにわかっている(と自分では思っていた)僕が読んでも、勉強になったポイントがいくつもありました。以下で紹介していきます。


Content Hugging Priority と Content Compression Resistance Priority と Instrinsic Content Size

250とか750とかのデフォルト値が振られてるアレです。


f:id:shu223:20160718095410j:image:w250


Auto Layoutはわかっているつもりでも、このへんの理解が曖昧なままwarningが出たときになんとなく優先度をいじってみたりしている、みたいな人は実は多いのではないでしょうか。私がまさにそうでしたが、本書では詳細かつ明解に解説されていて、曖昧に理解していたところがスッキリしました。以下メモ。

  • それぞれ Instrinsic Content Size についての「大きくなりにくさ」「小さくなりにくさ」を意味している*1
  • NSLayoutConstraintの優先度の値が同値の場合は、NSLayoutConstraintによる制約が優先される

レイアウトのライフサイクル(p35〜)

1. 制約の更新、2. フレームの更新、3. レンダリングというiOSにおけるレイアウトの3つのステップについて詳細に解説されています。


恥ずかしながら `updateConstraintsIfNeeded`, `layoutIfNeeded`, `layoutSubviews`, `setNeedsDsplay` といったメソッドでそれぞれ何が行われるのか、または何が行われないのか、といったことの理解が曖昧だったのですが、順序立ててわかりやすく解説されていて非常に勉強になりました。

  1. 制約の更新
    • `updateConstraints` が呼ばれる
    • ボトムアップ(子ビューから親ビュー)に制約の計算が実行される
    • 制約の有効/無効化、優先度変更、追加/削除などをトリガに実施される
    • この制約の更新を明示的に実行したい場合には `updateConstraintsIfNeeded` もしくは `setNeedsUpdateConstraints` を呼ぶ
  2. フレームの更新
    • `layoutSubviews` が呼ばれる
    • `layoutSubviews` が呼ばれると `updateConstraintsIfNeeded` も呼ばれ、必要に応じて制約の更新も行われる
    • トップダウン(親ビューから子ビュー)に実施される
    • ビューのフレームの変更・サブビューの追加・削除等をトリガに実施される
    • 明示的に実行したい場合には `layoutIfNeeded` もしくは `setNeedsLayout` を呼ぶ
    • `layoutSubview` をオーバーライドすると、`super.layoutSubviews()` の時点で既に制約の更新が完了しているので、そのレイアウト情報を用いて何らかの処理を実行したい場合に有効(+この方法で無限スクロールを実現する例)
  3. レンダリング
    • `drawRect:` が呼ばれる
    • 明示的に実行したい場合には `setNeedsDisplay` または `setNeedsDisplayInRect:` を呼ぶ

また `viewWillLayoutSubviews` と `viewDidLayoutSubviews` についても、それぞれの段階では(レイアウトサイクルの)どのステップは完了していて何は完了していないのか、というところの理解がスッキリしました。

  • viewWillLayoutSubviews
    • この時点では、サブリューのレイアウトは決定されていないが、画面の向きは決定している
    • この後、「制約の更新」と「フレームの更新」が実施される
  • viewDidLayoutSubviews
    • layoutSubviews による「フレームの更新」が完了すると呼ばれる
    • この後にレンダリングが行われるので、viewDidAppearはこれより後に呼ばれる

UIWindowの話

直接Auto Layoutとは関係ないですが、iOSでUIを実装するにあたってUIWindowに関して知っておいた方がいいことが簡潔に解説されています。`windowLevel` による重なり順の話とか、画面サイズを取得する場合に

UIScreen.mainScreen().bounds

UIScreen.sharedAppliation().keyWindow?.bounds

はどう違うか、とか。


UIStackView

iOS 9で追加された UIStackView についても、10ページを使ってしっかり解説されています。


ちなみに

Start with Stack View, use constraints as needed

まずはStack Viewを使って、必要に応じてconstraintsを使おう


WWDCのセッションでも言われていたとか。


コードで制約を設定する & NSLayoutAnchor

僕は基本的にはIB/Storyboardで制約を貼るのですが、仕事柄多くのプロジェクトに関わるので、「IB/Storyboard使わない派」な方々のコードに触れる機会も度々ありまして、コードで制約を設定することもたまにあります。


本書では、NSLayoutConstraint のイニシャライザを使う方法、VFL (Visual Format Language)を使う方法、iOS 9 で追加されたNSLayoutAnchorを使う方法等、まるまる一章を使ってその方法が解説されています。


ちなみにそろそろiOS 9の機能を使ってもいい(iOS 8を切ってもいい)空気になってきたと個人的には感じていますが、NSLayoutAnchor を使うと超シンプルかつ直感的にレイアウト制約をコードから設定できるようになります。


(before)

NSLayoutConstraint(item: subview,
                   attribute: .Leading,
                   relatedBy: .Equal,
                   toItem: view,
                   attribute: .LeadingMargin,
                   multiplier: 1.0,
                   constant: 0.0).active = true

(after)

let margins = view.layoutMarginsGuide
subview.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true

本章末尾のコラムではAuto Layoutを簡潔に書くためのオープンソースライブラリもいくつか紹介されています。


その他、細かい話

Auto Layout のアルゴリズム

この線型方程式系を解くアルゴリズムは、Greg J. Badros と Alan Borning、Peter J. Stuckey によって2001年に発表された、制約充足問題を説く Cassowary というツールキットで用いられたアルゴリズムを使用しています。(p.15)

明日から開発に活かせる、という話ではないのですが、こんなこともサラッと書かれていて、しっかり調べて執筆されている書籍なんだなということが伺えます。


外接矩形(alignment rects)をデバッグ時に確認する

[Edit Scheme] > [Run] > [Arguments] の [Arguments Passed On Launch] に `-UIViewShowAlignmentRects` を追加してチェックを入れると、実行時に外接矩形が表示される、というTips。


NSLayoutAttributeのLeft/RightとLeading/Trailingの違い

基本的にLeading/Trailingを使ってたので意識したことなかったですが、アラビア語とかヘブライ語のように右から左へ書く言語ではLeading/TrailingがそれぞれRight/Leftと同値となるそうです。


制約の矛盾が実行時に起きたときのエラーメッセージの見方

実行時にぶわーっと出てくるエラーメッセージ、ありますよね。僕は最近だとAutoLayoutを使ったアニメーションをやろうとして何かが間違っててこれが出てきました。で、メッセージ読んでもどの制約が悪いのかわかりづらい、と思ってたんですが、制約にちゃんとidentifierふればいいみたいです。(p86)


Xcode 7 の Storyboard Reference

Xcode 7 で追加された [Refactor to Storyboard...] メニューからの Storyboard の分割方法もしっかり書かれています。


Auto LayoutのデバッグTips

UIView に `exerciseAmbiguityInLayout()` なるメソッドがあり、これを用いると曖昧な制約を持つビューオブジェクトのフレームを、制約を満たす範囲でランダムに変更してくれるそうです。


他にもオブジェクトが持つインスタンス変数名と値を吐いてくれる `_ivarDescription` メソッド*2とか、ビューデバッガーの [Show Constraints] 機能とか、知らなかったことが色々と書いてありました。


まとめ

書籍『よくわかるAuto Layout』を紹介させていただきました。Auto Layoutがよくわかってない人を対象として書かれた書籍ですが、中級者にも勉強になる部分は多いと感じました。


本をまるっと一冊通読してAuto Layoutを勉強するというのはなかなか難しい、と感じる方もいらっしゃるかもしれません。が、目次を見れば分かる通り、Auto Layoutについてかなり網羅的かつ本質的に解説されてますので、リファレンス的に手元に置いておくのもいいのでは、と思います。


気になった方はぜひ!


よくわかるAuto Layout  iOSレスポンシブデザインをマスター
川邉 雄介
リックテレコム
売り上げランキング: 14,747


*1:この訳はAppleのドキュメントにあったのか著者のオリジナルかわかりませんが、簡潔で秀逸だなと思いました

*2:※Privateです

2015-09-17

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

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


iOS-9-Sampler


f:id:shu223:20150917065537j:image:w600


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


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


f:id:shu223:20150917073141j:image:w240


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 のサンプル集はこちら!正式リリースされたらスクリーンショットを貼っていきます。



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |