Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
速習iPhone Duo対応
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
野瀬田 裕樹
September 18, 2026
Programming
1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
速習iPhone Duo対応
extension DC Day1用です
野瀬田 裕樹
September 18, 2026
More Decks by 野瀬田 裕樹
See All by 野瀬田 裕樹
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
380
ネイティブiOSアプリだからできること
yuukiw00w
0
52
野瀬田とSwift愛好会
yuukiw00w
0
41
uhooiさん発ランダムタスクにチャレンジしよう!
yuukiw00w
1
87
ViewModelって200種類あんねん
yuukiw00w
0
65
Validate your App Intents adoption with AppIntentsTesting
yuukiw00w
0
62
App Intentsを実装しよう
yuukiw00w
0
63
iOS26時代の新規アプリ開発
yuukiw00w
0
280
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
420
Other Decks in Programming
See All in Programming
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
120
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
1.1k
続・コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions-again
handlename
0
120
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
160
ChromeでローカルLLM
ryu1013
0
160
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
160
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.7k
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.2k
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
280
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
9
6.5k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
530
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Why Our Code Smells
bkeepers
PRO
340
58k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
How to Talk to Developers About Accessibility
jct
2
590
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
440
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Designing for Performance
lara
612
70k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Transcript
速習iPhone Duo対応 合同会社DMM.com 野瀬田 裕樹(@ynoseda)
Speaker 野瀬田 裕樹(@ynoseda) 京都生まれ iOSがメインだけど Androidやったり たまにFlutterもやります
iPhone Duo、出ましたね
この登壇枠を申し込んだ時 サイドローディングの話とか 新規アプリでAI前提の設計で 色々やってることとか Swift 6.4の話とか 何話そうかなって色々 考えてたけどDuoで全部飛びました
ということで、 みんなでiPhone Duo対応 再チェックしましょう!
None
折り畳んだ状態の縦横 開いた状態の縦横 折り曲げた状態の縦横
10/23までに
iPhone Duoのこの6状態を 正常動作まで持っていかないと
😇
一つずつチェックしよう
1. デザインを理解する
None
HIG曰く
標準システムコンポーネントを使用し、 サイズ変更に対応するようにしてれば、 ほとんど調整することなく、 デバイスの向きに自動的に適応します
ほんまか?
いつもと位置が違うもの • タブバー • ツールバー • ナビゲーションバー • ステータスバー •
ライブアクティビティ
いつもと位置が違うもの • 開いた状態x横向き ナビゲーションバーがなくて 右側ツールバー上寄せ • 開いた状態x縦向き ステータスバーの位置が右上固定 • 同じアプリの例でも状態で色々違う
Safe Area • 縦向きなのに 左右にSafe Area
色々な開いた状態のUIパターン • Split View
色々な開いた状態のUIパターン • Split View • Sidebar
色々な開いた状態のUIパターン • Split View • Sidebar • コンテンツを2列表示に変更 etc
2. Duoに向けたデザイン対応
Xcodeのバージョンによる違い • Xcode 27未満:中央に小さく表示される • Xcode 27:Safe Areaを避けて表示される • Xcode
27.1:全画面に表示される
None
None
None
サイズクラス @Environment @Environment (\.horizontalSizeClass) (\.verticalSizeClass) outer display compact regular outer
display (横向き) compact compact inner display regular regular (縦向き)
Safe Area • ❌ view.safeAreaInsets.left * 2 • ✅ view.bounds.inset(by:
view.safeAreaInsets).width
角丸への対応 ConcentricRectangle()
独自UIで 折り目やカメラを避けたい
折り目・カメラ:予約済領域 • reservedRegionsでその領域を取ってきて避ける GeometryReader { proxy in let 折り目領域 =
proxy.reservedRegions(kind: .division) let 折り目が折り畳まなくても取れる = proxy.reservedRegions( kind: .division, options: .includeInactive ) let カメラ領域 = proxy.reservedRegions(kind: .occlusion) }
独自UIで横2列表現をしたい
ArrangementViewで横並び • 要素を2つに分割するレイアウトを組める(iOS 27.1+) NavigationStack { ArrangementView { Primary() }
secondary: { Secondary() } .arrangementViewStyle( .split ) } Primary Primary Secondary Secondary
ArrangementViewで横並び • 横向きだけで要素を2つに分割するレイアウトを組める(iOS 27.1+) NavigationStack { ArrangementView { Primary() }
secondary: { Secondary() } .arrangementViewStyle( .split.axes(.horizontal) ) } Primary Primary Secondary
ArrangementViewでoverlay • カスタムの重ね合わせレイアウトも組める(iOS 27.1+) // 重ね合わせているときのz方向のindexも取れる @Environment(\.overlayArrangementZIndex) private var zIndex
NavigationStack { ArrangementView { // 少し折り曲げた時はSecondaryが左半分に寄るから、 // Primaryを展開して表示したい、みたいなこともできる } Primary(zIndex > 0 ? .collapsed : .expanded) } secondary: { Secondary() } .arrangementViewStyle(.overlay) Secondary Primary
3. Duo特有の折り曲げに対応
ヒンジ(折りたたみ状態)の検知 struct InstrumentView: View { @State private var pitchBend: Double
= 0 var body: some View { GuitarView(pitchBend: pitchBend) .onHingeChange { _, context in if let hinge = context.hinge, hinge.status == .partiallyOpen { pitchBend = calculatePitchBend(angle: hinge.angle) } else { pitchBend = 0 } } } private func calculatePitchBend(angle: Angle) -> Double { ... } }
ヒンジ(折りたたみ状態)の検知 • onHingeChangeで折り畳みの状態の変化を検知できる • 引数のcontextからhingeの有無や折り畳み状態や角度が取れる
4. Duoのマルチシーンに対応
内側ディスプレイで2つのsceneが起動 • Duoは複数のアプリが 立ち上がる • 内側はマルチシーン対応だけど 外側はそうじゃないので注意 • 折り畳んだ状態で 新しいscene起動すると
失敗する
新しいsceneの起動の例 // 折り畳んで外側ディスプレイを使っている時のaction let alternate = UIAction(title: <#Alternate Action Title#>,
image: <#Alternate Action Image#>, handler: { _ in <#Perform Alternate Action#> }) // 新しいsceneを起動するaction let action = UIWindowScene.ActivationAction(alternate: alternate) { _ in let activity = NSUserActivity( activityType: <#Scene Activity Type#> ) return UIWindowScene.ActivationConfiguration(userActivity: activity) }
開いた状態で 外側のディスプレイも使いたい
Scene Accessory:カメラの例 struct CameraRootView: View { @State private var model
= Model() var body: some View { CameraView(model: model) .sceneAccessory { CameraCaptureAccessory { 外側ディスプレイに表示するView(model: model) } } } }
操作しないコンテンツ表示の例 struct RootView: View { var document: PresentationDocument var body:
some View { PresentationDocumentView(document: document) .sceneAccessory { ExternalNonInteractiveAccessory { PresentationPreview(document: document) } } } }
5. Vertical Controls
〜〜Barの位置変化に対応 • 左側のアプリは左側に 右側のアプリは右側に Controlsが縦に並ぶ
〜〜Barの位置変化に対応 • システム標準のものを使う NavigationStack { SomeView().toolbar { … } }
• ToolBarItemにはアイコンとテキストの両方を設定する Label("共有", systemImage: “square.and.arrow.up") → アイコンのみ/テキストのみ/両方表示をOSがよしなに切替する
toolbarだけど テキストボタンにしたい
axisBehaviorで水平方向に表示 .toolbar { ToolbarItem { SelectOrDoneButton() } .axisBehavior(.horizontalOnly) }
axisBehaviorで垂直方向に表示 .toolbar { ToolbarItem { 独自のCustomButton() } .axisBehavior(.verticalPreferred) // 独自のViewだけど縦に並べていいならこの指定もできる
} @Environment(\.toolbarVerticalEdge) private var 垂直軸上にtoolbarがあるかどうかも取れる
fl toolbarで …になる順番を決めたい (Over ow)
TabBarよりToolbarを残す
TabBarよりToolbarを残す TabView { Tab("Recents", systemImage: "clock") { ContentView() .toolbarVerticalCompressionBehavior( .prefersToolbarItems
// Toolbarが先に…になるデフォルト挙動を変えられる } } )
…を最後まで避ける要素を決める .toolbar { ToolbarItemGroup(placement: .primaryAction) { Button(〜〜) } .visibilityPriority(.high) //
.visibilityPriority(.low) 先に…に入る要素の指定も可 }
6. まとめ
やること • Xcode 27.1でビルドする • Size ClassとSafe Areaに対応してresizableにする • カスタムView関係に対応する(カスタムのtoolbarItemなど)
• Duoならではの表示に最適化する (2列表示、ヒンジ対応、折り曲げた状態でのUI調整など)
やっていきましょう