Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS16で変わった画面の向きを操作する方法 - iOSDC Japan 2023

ras0q
September 03, 2023

iOS16で変わった画面の向きを操作する方法 - iOSDC Japan 2023

ras0q

September 03, 2023
Tweet

More Decks by ras0q

Other Decks in Technology

Transcript

  1. 自己紹介 Ras (@ras0q) / Kira Kawai • 東京工業大学 (2020/04 ~)

    • 情報通信工学専攻 • デジタル創作同好会 traP • 株式会社ピクシブ (2022/04 ~) • iOSエンジニアアルバイトとして参加 • iOSDC Japan (2022 ~) • 参加2回目 • 初登壇 🎉 🎉 🎉
  2. 画面の向き(orientation)を回転させるアプリ • 通常時は縦向きのみを許可 • orientation = .portrait • 回転 ボ

    タンを押すことで強制的に横向きにする • orientation = .landscape • toggleOrientations(後述)が発火される GitHub: ras0q/iosdc2023-interface-orientation 題材
  3. class ViewController: UIViewController { override var supportedInterfaceOrientations { return currentOrientation

    } 実装方針 (共通) supportedInterfaceOrientations Ͱ޲͖Λ੍ޚ͢Δ ViewControllerごとに特定の向きのみを許可することができる 固定値であればInfo.plistに書いて制御することもできる
  4. func toggleOrientations() { // ޲͖ͷঢ়ଶΛtoggle͢Δ currentOrientation = ... // ࣮ࡍʹ޲͖Λมߋ͢Δ

    changeOrientation(to: currentOrientation) } 実装方針 (共通) toggleOrientations Ͱ޲͖Λมߋ͢Δ ճసϘλϯ͕ԡ͞Εͨͱ͖ʹൃՐ͢Δ
  5. class ViewController: UIViewController { override var shouldAutorotate: Bool { //

    ճసϘλϯΛԡ͢௚લ͚ͩtrueʹ͢Δ return canRotate } iOS15以前の向き操作 - 制御 編 shouldAutorotate をoverrideする 端末を傾けたときの自動回転を制御する真偽値 今回の題材では基本縦向きのみなのでfalseʹ͓ͯ͘͠ 回転時のみ一時的にtrueにして回転を許容する 🤔
  6. // ճస࣌ͷΈshouldAutorotateΛڐ༰͢Δඞཁ͕͋Δ canRotate = true UIDevice.current.setValue( orientation.rawValue, forKey: "orientation" )

    canRotate = false iOS15以前の向き操作 - 操作 編 UIDevice.current.setValue で向きを変更する なんでもセットメソッド 🤔 あまりにもHACK 排他制御しなくて大丈夫?
  7. iOS16以降の向き操作 - 制御 編 setNeedsUpdateOfSupportedInterfaceOrientations を呼ぶ 回転できる向きが変更されたことを明示的にViewControllerに知らせるメソッド supportedInterfaceOrientationsが再度読まれる // ޲͖ͷঢ়ଶΛมߋ͢Δ

    (·ͩViewControllerʹ͸มߋ͕఻Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶౓ಡΈࠐΈมߋΛ఻͑Δ setNeedsUpdateOfSupportedInterfaceOrientations()
  8. // ޲͖ͷঢ়ଶΛมߋ͢Δ (·ͩViewControllerʹ͸มߋ͕఻Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶౓ಡΈࠐΈมߋΛ఻͑Δ setNeedsUpdateOfSupportedInterfaceOrientations() //

    ޲͖ͷมߋΛཁٻ͢Δ windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: ...)) iOS16以降の向き操作 - 操作 編 requestGeometryUpdate で向きを変更する 指定した向きへの回転を要求するメソッド 許可されていない場合は設定したerrorHandler͕ݺ͹ΕΔ (optional)
  9. • setNeedsUpdateOfSupportedInterfaceOrientations() | Apple Developer Documentation • requestGeometryUpdate(_:errorHandler:) | Apple

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