3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SwiftUI】TabViewをスライドアニメーションで切り替える

Posted at

やりたいこと

SwiftUIのTabViewを使ったメニュー画面で、
タブ切り替えをスライドアニメーションで実装したい。

1. まずは普通のTabView

こちらは基本的なTabViewですね。
赤青黄のViewをタブで切り替えて表示しています。

ContentView.swift
import SwiftUI

struct ContentView: View {    
    var body: some View {
        VStack {
            TabView(selection: self.$selection) {
                Text("View 01").background(Color.red).tabItem{Text("View01")}.tag(0)
                Text("View 02").background(Color.blue).tabItem{Text("View02")}.tag(1)
                Text("View 03").background(Color.orange).tabItem{Text("View03")}.tag(2)
            }
        }
    }
}

こちらの結果を確認してみると下記のようになります。
 Simulator Screen Recording - iPod touch (7th generation) - 2021-05-31 at 19.06.27.gif

確かに切り替えはできていますが、画面切り替え時のアニメーションがない状態です。

2. PageTabViewを使ってみる

続いてTabViewのモディファイアの設定でPageTabViewを使ってみます。
こちらは各Viewを画面のスライドで切り替えることができる機能となります。

使い方としてはTabViewのtabViewStyleモディファイアにPageTabViewStyleを指定するだけです。

.tabViewStyle(PageTabViewStyle())

コード全体は下記のようになります。

ContentView.swift
import SwiftUI

struct ContentView: View {
    // 現在のタブ番号を状態変数で保持することでプログラムからViewを切り替えられる。
    @State private var selection : Int = 0
    
    var body: some View {
        VStack {
            TabView(selection: self.$selection) {
                Text("View 01").background(Color.red).tag(0)
                Text("View 02").background(Color.blue).tag(1)
                Text("View 03").background(Color.orange).tag(2)
            }
            .tabViewStyle(PageTabViewStyle())

            // PageTabViewにすると切り替え用のバーが消えるためボタンで代用
            HStack {
                Button(action: {self.selection = 0}, label: {
                    Text("赤のViewへ")
                }).background(Color.red).foregroundColor(.black)

                Button(action: {self.selection = 1}, label: {
                    Text("青のViewへ")
                }).background(Color.blue).foregroundColor(.black)

                Button(action: {self.selection = 2}, label: {
                    Text("黄のViewへ")
                }).background(Color.orange).foregroundColor(.black)
            }
        }
    }
}

PageTabViewではタブ切り替え用のバーは消えるためtabitemの削除と、
バーの代用としてボタンを3つ配置しています。


また現在のタブ番号を状態変数selectionで保持してTabView生成時にselection引数に渡しています。
こうするとselection変数を遷移したタブ番号にすることでViewの切り替えが可能となります。
例ではButtonを押した時にselectionを更新しています。


実際の画面がこちらです。
 Simulator Screen Recording - iPod touch (7th generation) - 2021-05-31 at 19.16.06.gif

スライドアニメーションでView切り替えができるようになりました!
ただ動画後半のボタンでの切り替えにはアニメーションが適用されていません。

3. スライドアニメーションを追加する

最後にボタン切り替え時にもアニメーションが適用されるようにするため、
下記モディファイアをTabViewに追加します。

.transition(.slide)
.animation(.easeInOut)

実際の画面がこちらです。 ![Simulator Screen Recording - iPod touch (7th generation) - 2021-05-31 at 19.21.54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233342/7f1084a1-e5d9-b43f-dd6f-6f6f17deec8d.gif)

buttonでの切り替えについてもスライドアニメーションで切り替えることができました!
あとはボタンのUIを整えればTabViewとPageTabViewの機能を兼ね備えたUIの完成ですね!

以上です。

3
7
1

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
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?