/*
Design+Code - SwiftUI for iOS 13
https://designcode.io/swiftui-gestures-and-events
*/
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
// view states
@State private var show = false // ⭐️ 控制要不要「展開卡片」
@State private var translation = CGSize.zero // ⭐️ 控制拖曳主卡時的「位移量」
// view body
var body: some View {
ZStack {
// 標題
TitleView()
.blur(radius: show ? 20 : 0)
.animation(.default)
// 底卡一
BackCard(.purple)
.scaleEffect(0.9)
.offset(x: 0, y: show ? -400 : -40) // ⚠️ 注意:
.offset(translation) // 平移(offset)愛設定幾次都可以!
.rotationEffect(.degrees(show ? 0 : 10))
.rotation3DEffect(.degrees(10), axis: (x: 1, y: 0, z: 0))
.blendMode(.hardLight)
.animation(.easeInOut(duration: 0.5))
// 底卡二
BackCard(.pink)
.scaleEffect(0.95)
.offset(x: 0, y: show ? -200 : -20)
.offset(translation)
.rotationEffect(.degrees(show ? 0 : 5))
.rotation3DEffect(.degrees(5), axis: (x: 1, y: 0, z: 0))
.blendMode(.hardLight)
.animation(.easeInOut(duration: 0.3))
// 主卡
Card()
// 1. 設定平移量
.offset(translation)
.blendMode(.hardLight)
// 2. 設定彈回動畫
.animation(.spring(response: 0.3, dampingFraction: 0.6, blendDuration: 0))
// ⭐️ 點擊主卡時,展開或收合卡片。
.onTapGesture { self.show.toggle() }
// ⭐️ 拖曳主卡時,主卡會跟著跑。 (1.2.3.)
// 停止拖曳時,主卡會彈回原位。 (1.2.4.)
.gesture(
DragGesture().onChanged{ value in // DragGesture.Value
// 拖曳的「位移量」竟然是個 CGSize,豈不怪哉 🤔⁉️
self.translation = value.translation // 3. 紀錄平移量
self.show = true
}.onEnded{ value in
self.translation = .zero // 4. 清除平移量
self.show = false
}
)
BottomCard()
.blur(radius: show ? 20 : 0)
.animation(.default)
} // ZStack (container)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.white)
}
}
PlaygroundPage.current.setLiveView(ContentView())