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