ZStack 中的颜色表现不正常
Color in ZStack not behaving properly
所以我想在另一个视图上方的 ZStack 顶部放置一个颜色。我不想使用叠加层的原因是 Color 将附加一个点击手势。下面是一个最小的可重现示例。本质上,我希望 Color.secondary 被限制在与 HStack 相同的区域(没有明确设置帧大小。这是代码:
struct ContentView: View {
var body: some View {
ZStack {
HStack {
Spacer()
Button(action: {
print("tapped button")
}, label: {
Text("button")
})
}.background(Color.red)
Color.secondary
.onTapGesture {
print("clicked color")
}
}
}
}
所以我希望视图只是一个白色屏幕,HStack 看起来稍微暗一点。
下面是我 UI 的照片。该视图在入职期间呈灰色,用户基本上只需点击灰色区域即可进入入职的下一步。如果我将点击手势附加到颜色视图,然后根据状态变化隐藏颜色视图,这不是问题。入职完成后,灰色区域将不存在,下面的按钮需要可交互。使用叠加层时,在加入后,我不想点击视图上的任何地方来更改应用程序状态。
https://i.stack.imgur.com/lphHg.png
根据你的进一步描述,我相信你把 onTapGesture(perform:)
放错了地方,在 overlay
的外面而不是里面。
在下面的代码中,onTapGesture(perform:)
只能在灰色叠加层显示时点击。然而,当它附加在 overlay
之后时,它可以在 而不是 点击按钮之类的东西时点击。
工作代码:
struct ContentView: View {
@AppStorage("is_onboarding") var isOnboarding = true
var body: some View {
HStack {
Spacer()
Button {
print("tapped button")
} label: {
Text("button")
}
}
.background(Color.red)
.overlay {
if isOnboarding {
Color.secondary
.onTapGesture {
print("clicked color")
isOnboarding = false
}
}
}
}
}
如果 iOS 14+ 而不是 iOS 15+,请改用以下 overlay
:
.overlay(
isOnboarding ?
Color.secondary
.onTapGesture {
print("clicked color")
isOnboarding = false
}
: nil
)
所以我想在另一个视图上方的 ZStack 顶部放置一个颜色。我不想使用叠加层的原因是 Color 将附加一个点击手势。下面是一个最小的可重现示例。本质上,我希望 Color.secondary 被限制在与 HStack 相同的区域(没有明确设置帧大小。这是代码:
struct ContentView: View {
var body: some View {
ZStack {
HStack {
Spacer()
Button(action: {
print("tapped button")
}, label: {
Text("button")
})
}.background(Color.red)
Color.secondary
.onTapGesture {
print("clicked color")
}
}
}
}
所以我希望视图只是一个白色屏幕,HStack 看起来稍微暗一点。
下面是我 UI 的照片。该视图在入职期间呈灰色,用户基本上只需点击灰色区域即可进入入职的下一步。如果我将点击手势附加到颜色视图,然后根据状态变化隐藏颜色视图,这不是问题。入职完成后,灰色区域将不存在,下面的按钮需要可交互。使用叠加层时,在加入后,我不想点击视图上的任何地方来更改应用程序状态。
https://i.stack.imgur.com/lphHg.png
根据你的进一步描述,我相信你把 onTapGesture(perform:)
放错了地方,在 overlay
的外面而不是里面。
在下面的代码中,onTapGesture(perform:)
只能在灰色叠加层显示时点击。然而,当它附加在 overlay
之后时,它可以在 而不是 点击按钮之类的东西时点击。
工作代码:
struct ContentView: View {
@AppStorage("is_onboarding") var isOnboarding = true
var body: some View {
HStack {
Spacer()
Button {
print("tapped button")
} label: {
Text("button")
}
}
.background(Color.red)
.overlay {
if isOnboarding {
Color.secondary
.onTapGesture {
print("clicked color")
isOnboarding = false
}
}
}
}
}
如果 iOS 14+ 而不是 iOS 15+,请改用以下 overlay
:
.overlay(
isOnboarding ?
Color.secondary
.onTapGesture {
print("clicked color")
isOnboarding = false
}
: nil
)