2
1

More than 1 year has passed since last update.

SwiftUIでのiOS・iPadの画面遷移時の表示方法の違い

Last updated at Posted at 2022-09-02

SwiftUIで画面遷移を実装した際に、
iPadとiPhoneで微妙に遷移時の表示が異なる場合があったので、まとめました。

■ 動作環境
iOS15.8
iPadPro mini(6th Generation)
※iPadPro(12.9inch)(5th Generation)も一部あり
iPhone13 mini

タブ遷移

■ iPad
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.19.37.gif

■ iOS
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 20.51.08.gif

■ ソースコード

import SwiftUI

@main
struct iPadTransitionTestApp: App {
    var body: some Scene {
        WindowGroup {
            TabView {
                TabTest1().tabItem { Image(systemName: "house") }
                TabTest2().tabItem { Image(systemName: "map") }
                TabTest3().tabItem { Image(systemName: "person.crop.circle") }
            }
        }
    }
}

ナビゲーション遷移

iPadの場合はNavigationViewStyleとisDetailLinkによって、表示方法が異なる

■ iOS
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 21.22.05.gif

■ iPad navigationViewStyle(.stack)の場合

  • iOSと同じ画面表示
  • isDetailLinkの設定は関係なし
    Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.30.56.gif

■ iPad navigationViewStyle(.columns)の場合

  • iOSと違い横にNavigationの選択肢が現れる。
  • また、isDetailLinkによって遷移先の表示方法が異なる
    Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.28.34.gif

■ iPad navigationViewStyle(.columns)の場合 横向き

  • 横向きの場合、左上にメニュー記号が現れる
    Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.37.43.gif

■ ソースコード

import SwiftUI

struct NavigationViewTest: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("遷移先1 isDetailLink(false)") {
                    NavigationTransition1()
                }.isDetailLink(false)
                NavigationLink("遷移先2 isDetailLink(true)") {
                    NavigationTransition2()
                }.isDetailLink(true)
                NavigationLink("遷移先3") {
                    NavigationTransition3()
                }
            }.navigationTitle(Text("メインタイトル"))
            Text("遷移先を選択してください")
        }.navigationViewStyle(.columns)
        // .navigationViewStyle(.stack)
    }
}

アラート表示

■ iOS
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 21.44.18.gif

■ iPad (縦向きも横向きも同じ挙動)
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.43.16.gif

■ ソースコード

import SwiftUI

struct AlertTest: View {
    @State var isActive = false
    var body: some View {
        Button("アラート表示") {
            isActive.toggle()
        }.alert("アラート表示", isPresented: $isActive, actions: {})
    }
}

シート表示

■ iOS
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 21.48.31.gif

■ iOS 横向き
全画面に覆われて表示される
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 21.49.44.gif

■ iPad 縦向き
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.54.44.gif

※ 今回はiPad miniを基準にして比較していますが、iPad Pro(12.9-inch)の場合は以下の表示
Simulator Screen Recording - iPad Pro (12.9-inch) (5th generation) - 2022-08-07 at 21.56.55.gif

■ iPad 横向き
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 21.55.52.gif

■ ソースコード

import SwiftUI

struct SheetTest: View {
    @State var isActive = false

    var body: some View {
        Button("シート表示") {
            isActive.toggle()
        }
        .sheet(isPresented: $isActive, onDismiss: {}) {
            SheetTest2()
        }
    }
}

コンファメーションダイアログ

■ iOS 縦向きも横向きも同じ挙動
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 22.07.42.gif

■ iPad 縦向きも横向きも同じ挙動
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 22.09.38.gif

■ ソースコード

import SwiftUI

struct ConfirmationDialogTest: View {
    @State var isActive = false
    var body: some View {
        Button("コンファメーションダイアログ表示") {
            isActive.toggle()
        }.confirmationDialog(Text("タイトル"), isPresented: $isActive, titleVisibility: Visibility.visible) {
            Button("はい") {}
            Button("いいえ") {}
        } message: {
            Text("詳細メッセージ")
        }
    }
}

ポップオーバー表示

■ iOS
シート表示と縦向きも横向きも挙動は同じ
Simulator Screen Recording - iPhone 13 mini - 2022-08-07 at 22.14.15.gif

■ iPad 縦向きも横向きも挙動は同じ
Simulator Screen Recording - iPad mini (6th generation) - 2022-08-07 at 22.16.55.gif

import SwiftUI

struct PopOverTest: View {
    @State var isActive = false
    var body: some View {
        Button("ポップオーバーテスト") {
            isActive.toggle()
        }
        .popover(isPresented: $isActive) {
            Text("ポップオーバー表示")
        }
    }
}

ドラッグジェスチャーを使った遷移

■ iOS・iPad
Simulator Screen Recording - iPhone 13 mini - 2022-08-08 at 09.39.55.gif

■ ソースコード
以下を参照
https://yosshiblog.jp/swiftui_draggesture/

その他、トランジッション、アニメーションを使った遷移

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1