14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

1年遅れのWWDC 2015 Tour

Last updated at Posted at 2016-12-18

これは iOS Advent Calendar 2016 18日目の投稿です。
昨日17日目は@tarappoさんのipaファイルの中身を調べるでした。ちょうどfastlaneのresignについて調べようと思っていたところなので、事前知識がまとまっていてありがたかったです!

背景

10月の勉強会で@takasekさんと話している時に、「去年のWWDC2015見直すといいよ」と言われ、
"うちまだiOS8対応してるもんなぁ"
なんて思っていたのですが、その2日後に予期せずして突然のiOS8切りが決定したので、約1.5ヶ月の間に見直したビデオ中からピックアップして、学んだことなどを書きます。

この投稿で紹介するセッション

他に What's New in Core Data とかも見たんですが、前提知識がなさすぎてついていけませんでした...

前提

この投稿内のSwiftコードはSwift 3に書き換えています。

WWDC 2015 Videos

App Frameworks

Advanced Touch Input on iOS

iOSでCore Animation, Metal, OpenGLがどのように内部処理されているかのセッション
結論から言うと、iOS 8では4/60秒フレームかかっていた描画処理が、iOS 9では3/60秒フレームになったらしい。さらにデバイスのスペックがいいものだと2.5/60秒フレームにまで短縮できるようになった。
またMetal, OpenGLはGPUで処理後に上位レイヤーであるCore Animationに処理を渡すことなく、直接LCDにパイプラインを繋げるようになったとのこと。
233_advanced_touch_input_on_ios.jpg

233_advanced_touch_input_on_ios.jpg
(https://developer.apple.com/videos/play/wwdc2015/233/)

iPad Air 2ではタッチスキャンが60Hzから120Hzになったので、指が動いた軌道をより滑らかに追うことが可能になりました。iPhone 7ではどうなのか調べてみたのですが見当たらず。どなたか情報をお持ちでしたら、教えてください。
また、2つのAPIが追加されました。
UIEvent.coalescedTouchespredictedTouches(for:) はMain touchを引数に軌道上の間を埋めるUITouch取得でき、UIEvent.predictedTouches(for:) はMain touchの先の軌道を予測したUITouchを取得できます。

for touch in touches {
    let line = line(for: touch)
    for coalescedTouch in event.coalescedTouches(for: touch) {
        addSample(for: coalescedTouch, to: line)
    }
    removePredictedSamples(from: line)
    for predictedTouch in event.predictedTouches(for: touch) {
        addPredictedSample(for: predictedTouch, to: line)
    }
}

Introducing Safari View Controller

タイトル通りSFSafariViewControllerについてのセッション
今考えるとATSによって、WebViewでWebサイトを開けなくなることを防ぐためにできたのかと思いますが、ATS対応をした今になって、ありがたみを感じました。
iOS 8を切る前からも使ってはいましたが、 iOS 9以上サポートにしたので、 #available(ios 9.0 *) を排除できました。

このセッションの中で一瞬だけWKWebViewの追加API load(_:mimeType:characterEncodingName:baseURL:) の紹介もされていました。

Mysteries of Auto Layout, Part 1

タイトルがすごいですね。ミステリアスって...
UIStackViewの概要とAuto Layoutの制約のTips&Tricksについてのセッション

  • Maintainable Layouts
  • Changing Constraints
  • View Sizing
  • Self-Sizing Table View Cells
  • Priorities
  • Alignment

iOS 9以上サポートにしてから、ガンガンUIStackViewを使っています。iOS 8を切った恩恵はこれが1番大きいと思っています。
また、Auot Layoutの制約の動的付け替えについても、Add and remove ではなく、Activate and deactivate がいいとのことが明示されています。
個人的にはInterface Builder上で ctl + shift + クリック で重なり合ったコンポーネントを一気に下れることを知れたのが学びでした。
Screen Shot 2016-12-17 at 21.10.25.png

そういえば、このセッションでのデモはObjective-Cだったのですが、スピーカーの好みで選択されているんでしょうか。

Mysteries of Auto Layout, Part 2

Layoutの決定、描画に関する説明とAuto LayoutのデバッグについてのTips&Tricksについてのセッション

  • The Layout Cycle
  • Legacy Layout
  • Constraint Creation
  • Constraining Negative Space • Unsatisfiable Constraints
  • Resolving Ambiguity

Layoutの描画に関しての説明は一見の価値があると思います。 (自分ももう1度見ようと思っています。)
Auto Layoutのデバッグについては、「Logを見て、適切に調整してね」って感じですが、accessibility identifiersを設定するといいよとのこと。@dealforestさんが前に言っていましたが、一個一個手作業で付けるのはめんどうなので、スクリプトがあるといいですね。

New UIKit Support for International User Interfaces

国によって違う文章等が左右に流れる方向を、Auto Layoutが吸収してくれるよという紹介のセッション
想定していたものと違いましたが、コンテンツとしておもしろかったです。
中でも UIImage.imageFlippedForRightToLeftLayoutDirection() を用いることで、画像の左右反転にも対応しているというのは驚きです。 (使う場面はRTL国対応しか思いつきませんが...)
Playground上では以下のコードで確認できます。

import UIKit

let image = #imageLiteral(resourceName: "icon.JPG") // 何かの画像
let imageView = UIImageView(image: image)

imageView.semanticContentAttribute = .forceRightToLeft // 強制的にRTL環境に変更
image.flipsForRightToLeftLayoutDirection

imageView.image = image.imageFlippedForRightToLeftLayoutDirection()

What's New in Storyboards

Storyboard ReferenceとCustom Segueについてのセッション
Scene Dockの存在を全く知らなかったんですが、めちゃくちゃ便利ですね。所属するUIViewControllerの生成時にはViewの生成だけ行われて、addSubViewされていない状態で存在し、そのViewを任意のタイミングで表示することができます。今まではIB上に直接Viewを置いてHiddenにしていたので、これは非常にありがたい。
Screen Shot 2016-12-18 at 9.16.12.png

このセッションの本質ではないのですが、前に疑問に思っていたiOS標準のRemindersアプリに近い画面構成のTipsを見れたのも収穫でした。

What's New in UIKit Dynamics and Visual Effects

DynamicItemに依る重力操作とUIVisualEffectViewを使ったBlurエフェクトについてのセッション
DynamicItemのサンプルはここからダウンロードできます。(Xcode 8.1で確認、Swift 3にコンバート済み)
デモの中でやっていた力場 (のようなもの) の可視化の方法がわからなかったですが、Panでの操作で近い四隅に動かすサンプルは確認できました。LINEのビデオ通話でも使われているのを見たことがありますが、結構簡単なコードで実現できそうです。
Blurエフェクトについては、わざわざコードで付けんでもという思いもありますが...

Media

What's New in Core Image

CIImageとAVFoundationについてのセッション
セッション内で使われているらしいサンプルアプリ CIFunHouseここからダウンロードできますが、Last Revisionが2013-06-13だったので、確証がありません。
残念ながら、使ってみたかった TextDetector のサンプルがなかったので、PixellatedPeople.m の103行目の

detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options];

detector = [CIDetector detectorOfType:CIDetectorTypeText context:nil options:options];

に書き換えて実行し、Filtersで Input VideoPixellate People で使ってみたところ、
IMG_1791.PNG
となりました...
認識してるのかすごく微妙なので、きちんと自分でサンプルを作って検証してみようと思います。
(Xcode 8.1で確認)

System Frameworks

Your App and Next Generation Networks

IPv6やTCPについてのセッション
アプリがIPv6に対応できているかの確認のためのTipsの紹介がされていましたが、もう今さらでしたね。
一応確認方法の参考: IPv6対応期限目前!!アプリが対応しているか確認する方法
正直1回見ただけでは、「へー」としか思えず、ネットワーク層やセッション層についての知識も必要だなと感じました...

まとめ

当たり前ですが、1年以上経っていると情報が古くなっていたり、すでに周知の事実になっていることもありますが、その中にも新しい発見が数多くありました。
iOS 10がリリースされ3ヶ月経ち、iOS 8を切るというアプリも多くなってきた今、再度WWDC 2015のセッションを見てみると幸せになれるかもしれません!!!
次はWWDC 2016を見直そうと思います!

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?