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
ras0q
September 03, 2023
Technology
0
2.5k
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
530
Embedded FrameworkからSPMへ 段階的移行の軌跡
ras0q
0
350
Other Decks in Technology
See All in Technology
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
300
Postman と API セキュリティ / Postman and API Security
yokawasa
0
200
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
13
3.6k
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
240
LINEヤフーのフロントエンド組織・体制の紹介【24年12月】
lycorp_recruit_jp
0
530
日本版とグローバル版のモバイルアプリ統合の開発の裏側と今後の展望
miichan
1
130
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
160
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
210
C++26 エラー性動作
faithandbrave
2
710
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
260
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
Featured
See All Featured
Music & Morning Musume
bryan
46
6.2k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Writing Fast Ruby
sferik
628
61k
YesSQL, Process and Tooling at Scale
rocio
169
14k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Visualization
eitanlees
146
15k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Become a Pro
speakerdeck
PRO
26
5k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Thoughts on Productivity
jonyablonski
67
4.4k
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 • ほとんどこれ 参考記事など