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

速習iPhone Duo対応

速習iPhone Duo対応

extension DC Day1用です

Avatar for 野瀬田 裕樹

野瀬田 裕樹

September 18, 2026

More Decks by 野瀬田 裕樹

Other Decks in Programming

Transcript

  1. サイズクラス @Environment @Environment (\.horizontalSizeClass) (\.verticalSizeClass) outer display compact regular outer

    display (横向き) compact compact inner display regular regular (縦向き)
  2. 折り目・カメラ:予約済領域 • reservedRegionsでその領域を取ってきて避ける GeometryReader { proxy in let 折り目領域 =

    proxy.reservedRegions(kind: .division) let 折り目が折り畳まなくても取れる = proxy.reservedRegions( kind: .division, options: .includeInactive ) let カメラ領域 = proxy.reservedRegions(kind: .occlusion) }
  3. 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
  4. ヒンジ(折りたたみ状態)の検知 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 { ... } }
  5. 新しい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) }
  6. Scene Accessory:カメラの例 struct CameraRootView: View { @State private var model

    = Model() var body: some View { CameraView(model: model) .sceneAccessory { CameraCaptureAccessory { 外側ディスプレイに表示するView(model: model) } } } }
  7. 操作しないコンテンツ表示の例 struct RootView: View { var document: PresentationDocument var body:

    some View { PresentationDocumentView(document: document) .sceneAccessory { ExternalNonInteractiveAccessory { PresentationPreview(document: document) } } } }
  8. 〜〜Barの位置変化に対応 • システム標準のものを使う NavigationStack { SomeView().toolbar { … } }

    • ToolBarItemにはアイコンとテキストの両方を設定する Label("共有", systemImage: “square.and.arrow.up") → アイコンのみ/テキストのみ/両方表示をOSがよしなに切替する
  9. やること • Xcode 27.1でビルドする • Size ClassとSafe Areaに対応してresizableにする • カスタムView関係に対応する(カスタムのtoolbarItemなど)

    • Duoならではの表示に最適化する (2列表示、ヒンジ対応、折り曲げた状態でのUI調整など)