Slide 1

Slide 1 text

iOSDC 2023 Japan iOS16で変わった 画面の向きを操作する方法 2023/09/02 17:20〜 Track B ルーキーズLT Ras

Slide 2

Slide 2 text

自己紹介 Ras (@ras0q) / Kira Kawai • 東京工業大学 (2020/04 ~) • 情報通信工学専攻 • デジタル創作同好会 traP • 株式会社ピクシブ (2022/04 ~) • iOSエンジニアアルバイトとして参加 • iOSDC Japan (2022 ~) • 参加2回目 • 初登壇 🎉 🎉 🎉

Slide 3

Slide 3 text

iOS16から 画面の向き操作APIが (正式に)追加されました

Slide 4

Slide 4 text

画面の向き(orientation)を回転させるアプリ • 通常時は縦向きのみを許可 • orientation = .portrait • 回転 ボ タンを押すことで強制的に横向きにする • orientation = .landscape • toggleOrientations(後述)が発火される GitHub: ras0q/iosdc2023-interface-orientation 題材

Slide 5

Slide 5 text

class ViewController: UIViewController { override var supportedInterfaceOrientations { return currentOrientation } 実装方針 (共通) supportedInterfaceOrientations Ͱ޲͖Λ੍ޚ͢Δ ViewControllerごとに特定の向きのみを許可することができる 固定値であればInfo.plistに書いて制御することもできる

Slide 6

Slide 6 text

func toggleOrientations() { // ޲͖ͷঢ়ଶΛtoggle͢Δ currentOrientation = ... // ࣮ࡍʹ޲͖Λมߋ͢Δ changeOrientation(to: currentOrientation) } 実装方針 (共通) toggleOrientations Ͱ޲͖Λมߋ͢Δ ճసϘλϯ͕ԡ͞Εͨͱ͖ʹൃՐ͢Δ

Slide 7

Slide 7 text

これまで

Slide 8

Slide 8 text

class ViewController: UIViewController { override var shouldAutorotate: Bool { // ճసϘλϯΛԡ͢௚લ͚ͩtrueʹ͢Δ return canRotate } iOS15以前の向き操作 - 制御 編 shouldAutorotate をoverrideする 端末を傾けたときの自動回転を制御する真偽値 今回の題材では基本縦向きのみなのでfalseʹ͓ͯ͘͠ 回転時のみ一時的にtrueにして回転を許容する 🤔

Slide 9

Slide 9 text

// ճస࣌ͷΈshouldAutorotateΛڐ༰͢Δඞཁ͕͋Δ canRotate = true UIDevice.current.setValue( orientation.rawValue, forKey: "orientation" ) canRotate = false iOS15以前の向き操作 - 操作 編 UIDevice.current.setValue で向きを変更する なんでもセットメソッド 🤔 あまりにもHACK 排他制御しなくて大丈夫?

Slide 10

Slide 10 text

currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false

Slide 11

Slide 11 text

👆 push! currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false

Slide 12

Slide 12 text

currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false toggleOrientations() 👆 push!

Slide 13

Slide 13 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: false toggleOrientations() ココはまだ読み込まれていない ので変わっていない 状態を変更 (プロパティを書き換えただけ) 👆 push!

Slide 14

Slide 14 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() 一時的に回転を許可 ココはまだ読み込まれていない ので変わっていない 👆 push!

Slide 15

Slide 15 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() ココはまだ読み込まれていない ので変わっていない UIDevice.current.setValue() 👆 push!

Slide 16

Slide 16 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() 読み込まれた UIDevice.current.setValue() 変更後の向きが サ ポ ートされているか確認 👆 push!

Slide 17

Slide 17 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() UIDevice.current.setValue() 変更後の向きが サ ポ ートされているか確認 参照 👆 push!

Slide 18

Slide 18 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() UIDevice.current.setValue() 変更後の向きが サ ポ ートされているか確認 OK! 👆 push!

Slide 19

Slide 19 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転できるか確認 UIDevice.current.setValue() 👆 push!

Slide 20

Slide 20 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転できるか確認 OK! UIDevice.current.setValue() 👆 push!

Slide 21

Slide 21 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転しろ! 命令だ!!😡 UIDevice.current.setValue() 👆 push!

Slide 22

Slide 22 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true 🎉

Slide 23

Slide 23 text

※ެࣜͰαϙʔτ͞Εͨํ๏Ͱ͸͋Γ·ͤΜ そして......

Slide 24

Slide 24 text

iOS16登場

Slide 25

Slide 25 text

iOS16から 画面の向き操作APIが (正式に)追加されました

Slide 26

Slide 26 text

shouldAutorotate setNeedsUpdateOfSupportedInterfaceOrientations UIDevice.current.setValue requestGeometryUpdate deprecated 😵 unavailable 🤯 ~iOS15 iOS16 ~

Slide 27

Slide 27 text

iOS16以降の向き操作 - 制御 編 setNeedsUpdateOfSupportedInterfaceOrientations を呼ぶ 回転できる向きが変更されたことを明示的にViewControllerに知らせるメソッド supportedInterfaceOrientationsが再度読まれる // ޲͖ͷঢ়ଶΛมߋ͢Δ (·ͩViewControllerʹ͸มߋ͕఻Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶౓ಡΈࠐΈมߋΛ఻͑Δ setNeedsUpdateOfSupportedInterfaceOrientations()

Slide 28

Slide 28 text

// ޲͖ͷঢ়ଶΛมߋ͢Δ (·ͩViewControllerʹ͸มߋ͕఻Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶౓ಡΈࠐΈมߋΛ఻͑Δ setNeedsUpdateOfSupportedInterfaceOrientations() // ޲͖ͷมߋΛཁٻ͢Δ windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: ...)) iOS16以降の向き操作 - 操作 編 requestGeometryUpdate で向きを変更する 指定した向きへの回転を要求するメソッド 許可されていない場合は設定したerrorHandler͕ݺ͹ΕΔ (optional)

Slide 29

Slide 29 text

currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false deprecated

Slide 30

Slide 30 text

currentOrientation: .portrait supportedInterfaceOrientations: .portrait 👆 push!

Slide 31

Slide 31 text

currentOrientation: .portrait supportedInterfaceOrientations: .portrait toggleOrientations() 👆 push!

Slide 32

Slide 32 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() ココはまだ読み込まれていない ので変わっていない 状態を変更 (プロパティを書き換えただけ) 👆 push!

Slide 33

Slide 33 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() サ ポ ートの変更を明示的に通知 ココはまだ読み込まれていない ので変わっていない setNeedsUpdateOfSupportedInterfaceOrientations() 👆 push!

Slide 34

Slide 34 text

currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() サ ポ ートの変更を明示的に通知 setNeedsUpdateOfSupportedInterfaceOrientations() 読み込まれた リロード 👆 push!

Slide 35

Slide 35 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() サ ポ ートの変更を明示的に通知 setNeedsUpdateOfSupportedInterfaceOrientations() リロード 参照 👆 push!

Slide 36

Slide 36 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 👆 push!

Slide 37

Slide 37 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更してください🙇 👆 push!

Slide 38

Slide 38 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更後の向きが サ ポ ートされているか確認 👆 push!

Slide 39

Slide 39 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更後の向きが サ ポ ートされているか確認 OK! 👆 push!

Slide 40

Slide 40 text

currentOrientation: .landspace supportedInterfaceOrientations: .landspace 🎉

Slide 41

Slide 41 text

iOS16以降のAPIで 安全に回転しよう🫨

Slide 42

Slide 42 text

ご清聴ありがとうご ざ いました! フィードバックお待ちしています

Slide 43

Slide 43 text

• setNeedsUpdateOfSupportedInterfaceOrientations() | Apple Developer Documentation • requestGeometryUpdate(_:errorHandler:) | Apple Developer Documentation • Swiftのorientation操作 (zenn.dev) • iOS15以前の話です • iOS16をサ ポ ートしよう! - bravesoft blog • ほとんどこれ 参考記事など