Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS16で変わった画面の向きを操作する方法 - iOSDC Japan 2023
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ras0q
September 03, 2023
Technology
0
3.9k
iOS16で変わった画面の向きを操作する方法 - iOSDC Japan 2023
ras0q
September 03, 2023
Tweet
Share
More Decks by ras0q
See All by ras0q
PencilKitで実装するPDFへの手書き注釈 / Handwritten-annotations to PDF with PencilKit
ras0q
0
1.2k
Embedded FrameworkからSPMへ 段階的移行の軌跡
ras0q
0
460
Other Decks in Technology
See All in Technology
Kiro IDEのドキュメントを全部読んだので地味だけどちょっと嬉しい機能を紹介する
khmoryz
0
210
今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話
logica0419
5
510
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
1
2.1k
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
260
Red Hat OpenStack Services on OpenShift
tamemiya
0
140
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
480
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.6k
22nd ACRi Webinar - 1Finity Tamura-san's slide
nao_sumikawa
0
110
AzureでのIaC - Bicep? Terraform? それ早く言ってよ会議
torumakabe
1
620
Claude_CodeでSEOを最適化する_AI_Ops_Community_Vol.2__マーケティングx_AIはここまで進化した.pdf
riku_423
2
610
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
330
Featured
See All Featured
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
58
50k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
120
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
280
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
200
Code Reviewing Like a Champion
maltzj
527
40k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.9k
The browser strikes back
jonoalderson
0
420
Automating Front-end Workflow
addyosmani
1371
200k
Transcript
iOSDC 2023 Japan iOS16で変わった 画面の向きを操作する方法 2023/09/02 17:20〜 Track B ルーキーズLT
Ras
自己紹介 Ras (@ras0q) / Kira Kawai • 東京工業大学 (2020/04 ~)
• 情報通信工学専攻 • デジタル創作同好会 traP • 株式会社ピクシブ (2022/04 ~) • iOSエンジニアアルバイトとして参加 • iOSDC Japan (2022 ~) • 参加2回目 • 初登壇 🎉 🎉 🎉
iOS16から 画面の向き操作APIが (正式に)追加されました
画面の向き(orientation)を回転させるアプリ • 通常時は縦向きのみを許可 • orientation = .portrait • 回転 ボ
タンを押すことで強制的に横向きにする • orientation = .landscape • toggleOrientations(後述)が発火される GitHub: ras0q/iosdc2023-interface-orientation 題材
class ViewController: UIViewController { override var supportedInterfaceOrientations { return currentOrientation
} 実装方針 (共通) supportedInterfaceOrientations Ͱ͖Λ੍ޚ͢Δ ViewControllerごとに特定の向きのみを許可することができる 固定値であればInfo.plistに書いて制御することもできる
func toggleOrientations() { // ͖ͷঢ়ଶΛtoggle͢Δ currentOrientation = ... // ࣮ࡍʹ͖Λมߋ͢Δ
changeOrientation(to: currentOrientation) } 実装方針 (共通) toggleOrientations Ͱ͖Λมߋ͢Δ ճసϘλϯ͕ԡ͞Εͨͱ͖ʹൃՐ͢Δ
これまで
class ViewController: UIViewController { override var shouldAutorotate: Bool { //
ճసϘλϯΛԡ͢લ͚ͩtrueʹ͢Δ return canRotate } iOS15以前の向き操作 - 制御 編 shouldAutorotate をoverrideする 端末を傾けたときの自動回転を制御する真偽値 今回の題材では基本縦向きのみなのでfalseʹ͓ͯ͘͠ 回転時のみ一時的にtrueにして回転を許容する 🤔
// ճస࣌ͷΈshouldAutorotateΛڐ༰͢Δඞཁ͕͋Δ canRotate = true UIDevice.current.setValue( orientation.rawValue, forKey: "orientation" )
canRotate = false iOS15以前の向き操作 - 操作 編 UIDevice.current.setValue で向きを変更する なんでもセットメソッド 🤔 あまりにもHACK 排他制御しなくて大丈夫?
currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false
👆 push! currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false
currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false toggleOrientations() 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: false toggleOrientations() ココはまだ読み込まれていない ので変わっていない 状態を変更
(プロパティを書き換えただけ) 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() 一時的に回転を許可 ココはまだ読み込まれていない ので変わっていない
👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() ココはまだ読み込まれていない ので変わっていない UIDevice.current.setValue()
👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait shouldAutorotate: true toggleOrientations() 読み込まれた UIDevice.current.setValue() 変更後の向きが
サ ポ ートされているか確認 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() UIDevice.current.setValue() 変更後の向きが サ
ポ ートされているか確認 参照 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() UIDevice.current.setValue() 変更後の向きが サ
ポ ートされているか確認 OK! 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転できるか確認 UIDevice.current.setValue() 👆
push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転できるか確認 OK! UIDevice.current.setValue()
👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true toggleOrientations() 回転しろ! 命令だ!!😡 UIDevice.current.setValue()
👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace shouldAutorotate: true 🎉
※ެࣜͰαϙʔτ͞Εͨํ๏Ͱ͋Γ·ͤΜ そして......
iOS16登場
iOS16から 画面の向き操作APIが (正式に)追加されました
shouldAutorotate setNeedsUpdateOfSupportedInterfaceOrientations UIDevice.current.setValue requestGeometryUpdate deprecated 😵 unavailable 🤯 ~iOS15 iOS16
~
iOS16以降の向き操作 - 制御 編 setNeedsUpdateOfSupportedInterfaceOrientations を呼ぶ 回転できる向きが変更されたことを明示的にViewControllerに知らせるメソッド supportedInterfaceOrientationsが再度読まれる // ͖ͷঢ়ଶΛมߋ͢Δ
(·ͩViewControllerʹมߋ͕Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶ಡΈࠐΈมߋΛ͑Δ setNeedsUpdateOfSupportedInterfaceOrientations()
// ͖ͷঢ়ଶΛมߋ͢Δ (·ͩViewControllerʹมߋ͕Θ͍ͬͯͳ͍) currentOrientation = ... // ໌ࣔతʹsupportedInterfaceOrientationsΛ࠶ಡΈࠐΈมߋΛ͑Δ setNeedsUpdateOfSupportedInterfaceOrientations() //
͖ͷมߋΛཁٻ͢Δ windowScene.requestGeometryUpdate(.iOS(interfaceOrientations: ...)) iOS16以降の向き操作 - 操作 編 requestGeometryUpdate で向きを変更する 指定した向きへの回転を要求するメソッド 許可されていない場合は設定したerrorHandler͕ݺΕΔ (optional)
currentOrientation: .portrait supportedInterfaceOrientations: .portrait shouldAutorotate: false deprecated
currentOrientation: .portrait supportedInterfaceOrientations: .portrait 👆 push!
currentOrientation: .portrait supportedInterfaceOrientations: .portrait toggleOrientations() 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() ココはまだ読み込まれていない ので変わっていない 状態を変更 (プロパティを書き換えただけ) 👆
push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() サ ポ ートの変更を明示的に通知 ココはまだ読み込まれていない ので変わっていない
setNeedsUpdateOfSupportedInterfaceOrientations() 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .portrait toggleOrientations() サ ポ ートの変更を明示的に通知 setNeedsUpdateOfSupportedInterfaceOrientations() 読み込まれた
リロード 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() サ ポ ートの変更を明示的に通知 setNeedsUpdateOfSupportedInterfaceOrientations() リロード
参照 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更してください🙇 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更後の向きが サ ポ
ートされているか確認 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace toggleOrientations() setNeedsUpdateOfSupportedInterfaceOrientations() requestGeometryUpdate() 変更後の向きが サ ポ
ートされているか確認 OK! 👆 push!
currentOrientation: .landspace supportedInterfaceOrientations: .landspace 🎉
iOS16以降のAPIで 安全に回転しよう🫨
ご清聴ありがとうご ざ いました! フィードバックお待ちしています
• setNeedsUpdateOfSupportedInterfaceOrientations() | Apple Developer Documentation • requestGeometryUpdate(_:errorHandler:) | Apple
Developer Documentation • Swiftのorientation操作 (zenn.dev) • iOS15以前の話です • iOS16をサ ポ ートしよう! - bravesoft blog • ほとんどこれ 参考記事など