我正在尝试使用SwiftUI在另一个按钮内插入一个按钮。但是,如果我按下该按钮,即使它没有运行动作关闭,它也会使外部按钮处于动画状态。有没有办法防止这种情况,也许使用自定义的ButtonStyle?
这是它的样子:
这是按下内部按钮时的样子:
这是我的代码:
var body: some View {
Button(action: {
print("outer button pressed")
}) {
HStack {
Text("Button")
Spacer()
Button(action: {
print("inner button pressed")
}) {
Circle()
.foregroundColor(Color.accentColor.opacity(0.2))
.frame(width: 28.0, height: 28.0)
.overlay(Image(systemName: "ellipsis"))
}
}
.padding()
.accentColor(.white)
.background(Color.accentColor)
.clipShape(RoundedRectangle(cornerRadius: 14.0, style: .continuous))
}
.frame(maxWidth: 200.0)
.padding()
}
答案 0 :(得分:0)
可能会有更优雅的解决方案,但是以下代码应为您提供所需的行为:
struct ContentView: View {
@State private var innerButtonDidTap = false
@State private var outerButtonDidTap = false
var body: some View {
HStack {
Text("Button")
Spacer()
Circle()
.onTapGesture {
print("inner button tapped")
innerButtonDidTap.toggle()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
innerButtonDidTap.toggle()
}
}
.foregroundColor(Color.accentColor.opacity(innerButtonDidTap ? 1.0 : 0.2))
.frame(width: 28.0, height: 28.0)
.overlay(Image(systemName: "ellipsis"))
}
.contentShape(Rectangle())
.onTapGesture {
print("outer button tapped")
outerButtonDidTap.toggle()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
outerButtonDidTap.toggle()
}
}
.frame(maxWidth: 200)
.padding()
.accentColor(.white)
.foregroundColor(.white)
.background(Color.accentColor.opacity(outerButtonDidTap ? 0.2 : 1))
.animation(Animation.linear(duration: 0.1))
.clipShape(RoundedRectangle(cornerRadius: 14.0, style: .continuous))
}
}
因此,我使用的是HStack
和Circle
以及两个onTapGesture
修饰符,而不是两个按钮。
答案 1 :(得分:0)
如何在ZStack中使用2个不同的按钮?
var body: some View {
ZStack(alignment: .trailing) {
Button(action: {
print("outer button pressed")
}) {
HStack {
Text("Button")
Spacer()
}
.padding()
.accentColor(.white)
.background(Color.accentColor)
.clipShape(RoundedRectangle(cornerRadius: 14.0, style: .continuous))
}
.frame(maxWidth: 200.0)
.padding()
Button(action: {
print("inner button pressed")
}) {
Circle()
.foregroundColor(Color.accentColor.opacity(0.2))
.frame(width: 28.0, height: 28.0)
.overlay(Image(systemName: "ellipsis"))
.padding()
.accentColor(.white)
.clipShape(RoundedRectangle(cornerRadius: 14.0, style: .continuous))
}
.padding()
}
}