SwiftUI:有没有办法将按钮放在按钮内?

问题描述

我正在尝试使用SwiftUI在另一个按钮内插入一个按钮。但是,如果我按下该按钮,即使它没有运行动作关闭,它也会使外部按钮处于动画状态。有没有办法防止这种情况,也许使用自定义的ButtonStyle?

这是它的样子:

Button

这是按下内部按钮时的样子:

Pressed Button

这是我的代码

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()
}

解决方法

可能会有更优雅的解决方案,但是以下代码应为您提供所需的行为:

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))
    }
}

因此,我使用的是HStackCircle以及两个onTapGesture修饰符,而不是两个按钮。

,

如何在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()

        }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...