3
8

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 1 year has passed since last update.

SwiftUI 表と裏を切り替えてカードめくりを表現する

Last updated at Posted at 2021-05-20

はじめに

ちょっと便利なものを作ってみました。カードゲームを作ったり、面白いUIをアプリに組み込みたいときにどうぞ。

fb.gif

使い方

表: true, 裏: false

  • @State var isFront = true みたいな感じで、 表裏の状態を表す変数 を作っておいてください。
    ボタンを押した時とかにこの変数を変更すれば 表裏が切り替わります。

Flip

  • Flip(変数, { 表 }, { 裏 }) を使います。
  • duration: めくるスピードを調整できます。設定しなくてもOK。
Sample.swift

...
// 裏と表がある View
Flip(isFront: isFront, // 先に作っておいた変数 isFront
     front: {

         Image("H1") // 表面 ハートのA
     },
     back: {

         Image("Back") // カード裏面
     })
...

コピペ用コード

丸々コピペしてプロジェクト内のどこかにおいてください。

Flip.swift

import SwiftUI

struct Flip<Front: View, Back: View>: View {
    var isFront: Bool
    @State var canShowFrontView: Bool
    let duration: Double
    let front: () -> Front
    let back: () -> Back
    
    init(isFront: Bool,
         duration: Double = 1.0,
         @ViewBuilder front: @escaping () -> Front,
         @ViewBuilder back: @escaping () -> Back) {
        self.isFront = isFront
        self._canShowFrontView = State(initialValue: isFront)
        self.duration = duration
        self.front = front
        self.back = back
    }
    
    var body: some View {
        ZStack {
            if self.canShowFrontView {
                front()
            }
            else {
                back()
                    .rotation3DEffect(Angle(degrees: 180), axis: (x: 0, y: 1, z: 0))
            }
        }
        .onChange(of: isFront, perform: {
            value in
            DispatchQueue.main.asyncAfter(deadline: .now() + duration/2.0) {
                self.canShowFrontView = value
            }
        })
        .animation(nil)
        .rotation3DEffect(isFront ? Angle(degrees: 0): Angle(degrees: 180), axis: (x: CGFloat(0), y: CGFloat(10), z: CGFloat(0)))
        .animation(.easeInOut(duration: duration))
    }
}

さいごに

「めくる」って何か良い響きですよね

3
8
3

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
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?