Animation 如何在ZStack中捕获自定义卡视图上的点击?

Animation 如何在ZStack中捕获自定义卡视图上的点击?,animation,swiftui,gesture,Animation,Swiftui,Gesture,我很努力地重新创建一些东西,比如钱包视图,但我真的搞不懂。我已经将偏移量硬编码到ZStack中,但我当然也希望避免这种情况。看起来偏移量根本就阻止了水龙头注册。这是我到目前为止的代码,点击一张卡片应该会在白色和黄色之间改变其标题的颜色 最后,当然,我想把动画添加到卡片堆栈中,并能够从它的位置“拉”出一张,使其成为主视图。但我得先弄清楚怎么接住水龙头 我用这个视频作为基础,但它并没有达到我想要的程度: 结构ContentView:View{ var body:一些观点{ 滚动视图(.verti

我很努力地重新创建一些东西,比如钱包视图,但我真的搞不懂。我已经将偏移量硬编码到ZStack中,但我当然也希望避免这种情况。看起来偏移量根本就阻止了水龙头注册。这是我到目前为止的代码,点击一张卡片应该会在白色和黄色之间改变其标题的颜色

最后,当然,我想把动画添加到卡片堆栈中,并能够从它的位置“拉”出一张,使其成为主视图。但我得先弄清楚怎么接住水龙头

我用这个视频作为基础,但它并没有达到我想要的程度:


结构ContentView:View{
var body:一些观点{
滚动视图(.vertical){
ZStack(对齐:。顶部){
CardView(标题:“阿迪达斯”,颜色:。蓝色,填充偏移:0)
CardView(标题:“Le Crueset”,颜色:。粉色,填充偏移:90)
CardView(标题: 卡片”,颜色:。黑色,填充偏移量:180)
CardView(标题:“Sandusk”,颜色:。橙色,填充偏移:270)
}
}
}
}
结构卡视图:视图{
@状态变量为黄色:Bool=false
标题:字符串
让颜色:颜色
var填充偏移:CGFloat
var body:一些观点{
ZStack{
矩形()
.填充(颜色)
VStack{
正文(标题)
.font(.largeTitle)
.bold()
.foregroundColor(黄色?.yellow:.白色)
.padding()
垫片()
}
}.阴影(半径:2.0)
.转弯半径(10)
.框架(宽:320,高:210)
.padding(.top,paddingOffset)
.ontapsigne{
self.isYellow.toggle()
打印(“点击:\(self.title)”)
}
}
}

结构ContentView:View{
var body:一些观点{
滚动视图(.vertical){
ZStack(对齐:。顶部){
CardView(标题:“阿迪达斯”,颜色:。蓝色,填充偏移:0)
CardView(标题:“Le Crueset”,颜色:。粉色,填充偏移:90)
CardView(标题: 卡片”,颜色:。黑色,填充偏移量:180)
CardView(标题:“Sandusk”,颜色:。橙色,填充偏移:270)
}
}
}
}
结构卡视图:视图{
@状态变量为黄色:Bool=false
标题:字符串
让颜色:颜色
var填充偏移:CGFloat
var body:一些观点{
ZStack{
矩形()
.填充(颜色)
VStack{
正文(标题)
.font(.largeTitle)
.bold()
.foregroundColor(黄色?.yellow:.白色)
.padding()
垫片()
}
}.阴影(半径:2.0)
.转弯半径(10)
.框架(宽:320,高:210)
.padding(.top,paddingOffset)
.ontapsigne{
self.isYellow.toggle()
打印(“点击:\(self.title)”)
}
}
}

我认为您不需要在同一视图上同时使用
按钮
移动手势
。您的
CardView
已经是一个按钮,因此它将注册点击手势。为了使其正常工作,我建议您移动按钮本身的偏移量。看起来只有当它有足够的高度时,它才会在所有视图上注册点击,所以我在设置偏移后在按钮上设置了一个帧。 总体而言,代码如下所示:

导入快捷界面
结构BetterCards:视图{
var body:一些观点{
滚动视图(.vertical){
ZStack(对齐:。顶部){
CardView(标题:“阿迪达斯”,颜色:。蓝色,偏移量:0.0)
CardView(标题:“Le Crueset”,颜色:。粉色,偏移量:90.0)
CardView(标题: 卡片”,颜色:。黑色,偏移量:180.0)
CardView(标题:“Sandusk”,颜色:。橙色,偏移量:270.0)
}
.padding()
}
}
}
结构卡视图:视图{
@状态变量为黄色:Bool=false
标题:字符串
让颜色:颜色
让偏移量:CGFloat
var body:一些观点{
按钮(操作:{
self.isYellow.toggle()
打印(“点击:\(self.title)”)
}) {
ZStack{
矩形()
.填充(颜色)
.转弯半径(10)
.框架(宽:320,高:210)
VStack{
正文(标题)
.font(.largeTitle)
.bold()
.foregroundColor(黄色?.yellow:.白色)
.padding()
垫片()
}
.框架(宽:320,高:210)
}
.阴影(半径:2.0)
}
.偏移量(x:0,y:offset)
.框架(宽度:320,高度:210+偏移,对齐:.顶部)
}
}

您可以在不同的视图上使用对齐和填充来获得所需的内容。

我认为您不需要在同一视图上同时使用
按钮和
ontapposition
。您的
CardView
已经是一个按钮,因此它将注册点击手势。为了使其正常工作,我建议您移动按钮本身的偏移量。看起来只有当它有足够的高度时,它才会在所有视图上注册点击,所以我在设置偏移后在按钮上设置了一个帧。 总体而言,代码如下所示:

导入快捷界面
结构BetterCards:视图{
var body:一些观点{
滚动视图(.vertical){
ZStack(对齐:。顶部){
CardView(标题:“阿迪达斯”,颜色:。蓝色,偏移量:0.0)
CardView(标题:“Le Crueset”,颜色:。粉色,偏移量:90.0)
CardView(标题: 卡”,上校
import SwiftUI

struct BetterCards: View {
    var body: some View {

        ScrollView (.vertical) {
                ZStack {
                    CardView(title: "adidas", color: .blue, offset: 0.0)
                    CardView(title: "Le Crueset", color: .pink, offset: 90.0)
                    CardView(title: " Card", color: .black, offset: 180.0)
                    CardView(title: "Sandusk", color: .orange, offset: 270.0)
            }
        }
    }
}


struct CardView: View {

    @State var isYellow: Bool = false

    let title: String
    let color: Color
    let offset: CGFloat

    var body: some View {


        Button(action: {
            self.isYellow.toggle()
        }) {
            ZStack {
                 Rectangle()
                    .fill(color)
                    .cornerRadius(10)
                    .frame(width: 320, height: 210)
                VStack {
                    Text(title)
                        .font(.largeTitle)
                        .bold()
                        .foregroundColor(isYellow ? .yellow : .white)
                        .padding()
                    Spacer()
                }

            }.shadow(radius: 2.0)
            .offset(x: 0, y: offset)

            }.onTapGesture {
            print("Tapped: \(self.title)")
        }
    }
}

struct BetterCards_Previews: PreviewProvider {
    static var previews: some View {
        BetterCards()
    }
}
import SwiftUI

struct BetterCards: View {

    let multiplier:CGFloat = 6

    var body: some View {

        ScrollView {
            Text("HEADER").background(Color(.blue))
            VStack {
                CardView(title: " Card", color: .black)
                CardView(title: "adidas", color: .blue)
                CardView(title: "Puma", color: .green)
                CardView(title: "Le Crueset", color: .yellow)
//                CardView(title: "adidas", color: .blue)
//                CardView(title: "OnlyLyon", color: .green)
//                CardView(title: "Le Crueset", color: .yellow)
                CardView(title: "adidas", color: .blue)
                CardView(title: "Sandusk", color: .orange)
//                CardView(title: "Le Crueset", color: .pink)
                }
            .frame(width: 400, height: multiplier * 60 + (430 - ( 52 )))
            .padding()
            .background(Color.gray)
            Text("FOOTER").background(Color(.blue))
        }
        .background(Color.yellow)
    }
}

struct CardView: View {

    @State var isYellow: Bool = false

    let title: String
    let color: Color

    var body: some View {
        ZStack {
             Rectangle()
                .fill(color)
                .cornerRadius(10)
                .frame(width: 370, height: 430)
            VStack {
                Text(title)
                    .font(.largeTitle)
                    .bold()
                    .foregroundColor(isYellow ? .yellow : .white)
                    .padding()
                Spacer()
                }
        }
        .frame(width: 370, height: 60)
        .onTapGesture {
                self.isYellow.toggle()
                print("Tapped: \(self.title)")
        }
        .shadow(radius: 2.0)
    }
}

struct BetterCards_Previews: PreviewProvider {
    static var previews: some View {
        BetterCards()
    }
}