diff --git a/AsyncSwift.xcodeproj/project.pbxproj b/AsyncSwift.xcodeproj/project.pbxproj index 37317ac..228bc87 100644 --- a/AsyncSwift.xcodeproj/project.pbxproj +++ b/AsyncSwift.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + B289943328CA69FF002B9F67 /* StampView+Observed.swift in Sources */ = {isa = PBXBuildFile; fileRef = B289943228CA69FF002B9F67 /* StampView+Observed.swift */; }; B2E1083128C9CD6900C3DD59 /* AppData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E1083028C9CD6900C3DD59 /* AppData.swift */; }; C63A865F28CA70ED0064C417 /* EventDetailView+Observed.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63A865E28CA70ED0064C417 /* EventDetailView+Observed.swift */; }; C63A866128CB252D0064C417 /* Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63A866028CB252D0064C417 /* Mock.swift */; }; @@ -33,6 +34,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + B289943228CA69FF002B9F67 /* StampView+Observed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StampView+Observed.swift"; sourceTree = ""; }; B2E1083028C9CD6900C3DD59 /* AppData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppData.swift; sourceTree = ""; }; C63A865E28CA70ED0064C417 /* EventDetailView+Observed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EventDetailView+Observed.swift"; sourceTree = ""; }; C63A866028CB252D0064C417 /* Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mock.swift; sourceTree = ""; }; @@ -154,6 +156,7 @@ C63A865E28CA70ED0064C417 /* EventDetailView+Observed.swift */, C66DAD4F28CF478700195DEB /* SessionView+Observed.swift */, B2E1083028C9CD6900C3DD59 /* AppData.swift */, + B289943228CA69FF002B9F67 /* StampView+Observed.swift */, ); path = Observed; sourceTree = ""; @@ -242,6 +245,7 @@ C68DE95128C77DDA00CA4CC8 /* TicketingView.swift in Sources */, C6F7798B28C9CBC60036773B /* EventView+Observed.swift in Sources */, C6F7798728C9CB3A0036773B /* StampView.swift in Sources */, + B289943328CA69FF002B9F67 /* StampView+Observed.swift in Sources */, C63A865F28CA70ED0064C417 /* EventDetailView+Observed.swift in Sources */, C68DE94F28C77DC900CA4CC8 /* EventView.swift in Sources */, C68DE93828C7685800CA4CC8 /* MainTabView.swift in Sources */, diff --git a/AsyncSwift/Observed/AppData.swift b/AsyncSwift/Observed/AppData.swift index 523fda0..306ea97 100644 --- a/AsyncSwift/Observed/AppData.swift +++ b/AsyncSwift/Observed/AppData.swift @@ -9,8 +9,8 @@ import SwiftUI import UIKit final class AppData: ObservableObject { - @Published var currentTab: Tab = .event - + @Published var currentTab: Tab = .event // Universal Link로 앱진입시 StampView 전환을 위한 변수 + var scannedSeminarQR = true // Universal Link로 진입시 QR코드 스캔 여부 } diff --git a/AsyncSwift/Observed/StampView+Observed.swift b/AsyncSwift/Observed/StampView+Observed.swift new file mode 100644 index 0000000..f6da6b3 --- /dev/null +++ b/AsyncSwift/Observed/StampView+Observed.swift @@ -0,0 +1,47 @@ +// +// StampView+Observed.swift +// AsyncSwift +// +// Created by Inho Choi on 2022/09/09. +// + +import SwiftUI + +extension StampView { + final class Observed: ObservableObject { + @Published var cardAnimatonModel = CardAnimationModel() + + private let durationAndDelay: CGFloat = 0.3 + + func didTabCard () { + cardAnimatonModel.isTapped.toggle() + + if cardAnimatonModel.isTapped { // 카드 회전 연속을 위해서 if문 분리 + withAnimation(.linear(duration: durationAndDelay)) { + cardAnimatonModel.backDegree = 90 + } + withAnimation(.linear(duration: durationAndDelay).delay(durationAndDelay)) { + cardAnimatonModel.frontDegree = 0 + } + } else { + withAnimation(.linear(duration: durationAndDelay)) { + cardAnimatonModel.frontDegree = -90 + } + withAnimation(.linear(duration: durationAndDelay).delay(durationAndDelay)) { + cardAnimatonModel.backDegree = 0 + } + } + } + } + + struct CardAnimationModel: Identifiable { + fileprivate init() {} + + let id = UUID() + var backDegree: Double = 0.0 + var frontDegree: Double = -90.0 + var isTapped = false + } +} + + diff --git a/AsyncSwift/Views/StampView.swift b/AsyncSwift/Views/StampView.swift index 7b6f9a1..52621ba 100644 --- a/AsyncSwift/Views/StampView.swift +++ b/AsyncSwift/Views/StampView.swift @@ -8,43 +8,39 @@ import SwiftUI struct StampView: View { - var tempisScanned = true - - @State private var backDegree: Double = 0.0 - @State private var frontDegree: Double = -90.0 - @State private var isFlipped = false - - let durationAndDelay: CGFloat = 0.3 + @EnvironmentObject var appData: AppData + @ObservedObject var observed = Observed() var body: some View { NavigationView { Group { - if tempisScanned { - Button(action: { flipCard() }) { - ZStack { - stampBack - stampFront - } + if appData.scannedSeminarQR { + ZStack { + stampBack + stampFront + } + .onTapGesture { + observed.didTabCard() } } else { notScannedView } } - .padding(36) - .navigationTitle("Stamp") + .padding(36) + .navigationTitle("Stamp") } } // body } // View private extension StampView { - + @ViewBuilder var stampBack: some View { Image("Seminar002StampBack") .resizable() .aspectRatio(contentMode: .fit) - .shadow(color: Color(.sRGB, red: 0, green: 0, blue: 0, opacity: 0.2), radius: 20 , x: 40 * frontDegree / 90, y: 4) - .rotation3DEffect(Angle(degrees: frontDegree), axis: (x: 0, y: 1, z: 0)) + .shadow(color: Color(.sRGB, red: 0, green: 0, blue: 0, opacity: 0.2), radius: 20, x: 40 * observed.cardAnimatonModel.frontDegree / 90, y: 4) + .rotation3DEffect(Angle(degrees: observed.cardAnimatonModel.frontDegree), axis: (x: 0, y: 1, z: 0)) } @ViewBuilder @@ -53,8 +49,8 @@ private extension StampView { .resizable() .aspectRatio(contentMode: .fit) - .shadow(color: Color(.sRGB, red: 0, green: 0, blue: 0, opacity: 0.2), radius: 20, x: 40 * backDegree / 90, y: 4) - .rotation3DEffect(Angle(degrees: backDegree), axis: (x: 0, y: 1, z: 0)) + .shadow(color: Color(.sRGB, red: 0, green: 0, blue: 0, opacity: 0.2), radius: 20, x: 40 * observed.cardAnimatonModel.backDegree / 90, y: 4) + .rotation3DEffect(Angle(degrees: observed.cardAnimatonModel.backDegree), axis: (x: 0, y: 1, z: 0)) } @ViewBuilder @@ -67,27 +63,6 @@ private extension StampView { .foregroundColor(.gray) } } - - //MARK: Flip Card Function - func flipCard () { - isFlipped.toggle() - - if isFlipped { // 카드 회전 연속을 위해서 if문 분리 - withAnimation(.linear(duration: durationAndDelay)) { - backDegree = 90 - } - withAnimation(.linear(duration: durationAndDelay).delay(durationAndDelay)) { - frontDegree = 0 - } - } else { - withAnimation(.linear(duration: durationAndDelay)) { - frontDegree = -90 - } - withAnimation(.linear(duration: durationAndDelay).delay(durationAndDelay)) { - backDegree = 0 - } - } - } } struct StampView_Previews: PreviewProvider {