Swiftui 悬停自定义按钮时的矩形覆盖

Swiftui 悬停自定义按钮时的矩形覆盖,swiftui,Swiftui,我试图定义一个自定义按钮样式,悬停时,按钮周围会弹出一个矩形 struct CustomButtonStyle: ButtonStyle { @State private var isOverButton = false func makeBody(configuration: Self.Configuration) -> some View { ZStack { configuration.label .frame(minWidth:

我试图定义一个自定义按钮样式,悬停时,按钮周围会弹出一个矩形

struct CustomButtonStyle: ButtonStyle {
@State private var isOverButton = false

func makeBody(configuration: Self.Configuration) -> some View {

    ZStack {
        configuration.label
            .frame(minWidth: 0, maxWidth: .infinity)
            .padding()
            .foregroundColor(.white)
            .background(Color("Frost1"))
    }
    .padding(3)
    .onHover { over in
        self.isOverButton = over
        print("isOverButton:", self.isOverButton, "over:", over)
    }
    .overlay(VStack {
        if self.isOverButton {
            Rectangle()
                .stroke(Color("Frost1"), lineWidth: 2)
        } else {
            EmptyView()
        }
    })
}}

打印行显示设置变量“isOverButton”无效。我应该使用哪种类型的变量状态,可以从“onHover”更新并更新“overlay”?

下面是一个解决方案。使用Xcode 11.4进行测试

struct testonhover按钮:视图{
var body:一些观点{
按钮(“按钮”){}
.buttonStyle(CustomButtonStyle())
}
}
结构CustomButtonStyle:ButtonStyle{
私有结构CustomButtonStyleView:视图{
@状态私有变量isOverButton=false
让内容:()->V
var body:一些观点{
ZStack{
内容()
.frame(最小宽度:0,最大宽度:无穷大)
.padding()
.foregroundColor(.白色)
.背景(颜色.蓝色)
}
.填充(3)
.onHover{over in
self.isOverButton=结束
打印(“isOverButton:,self.isOverButton,”over:,over)
}
.覆盖层(VStack){
如果self.isOverButton{
矩形()
.笔划(颜色.蓝色,线宽:2)
}否则{
EmptyView()
}
})
}
}
func makeBody(配置:Self.configuration)->一些视图{
CustomButtonStyleView{configuration.label}
}
}

这里有一个解决方案。使用Xcode 11.4进行测试

struct testonhover按钮:视图{
var body:一些观点{
按钮(“按钮”){}
.buttonStyle(CustomButtonStyle())
}
}
结构CustomButtonStyle:ButtonStyle{
私有结构CustomButtonStyleView:视图{
@状态私有变量isOverButton=false
让内容:()->V
var body:一些观点{
ZStack{
内容()
.frame(最小宽度:0,最大宽度:无穷大)
.padding()
.foregroundColor(.白色)
.背景(颜色.蓝色)
}
.填充(3)
.onHover{over in
self.isOverButton=结束
打印(“isOverButton:,self.isOverButton,”over:,over)
}
.覆盖层(VStack){
如果self.isOverButton{
矩形()
.笔划(颜色.蓝色,线宽:2)
}否则{
EmptyView()
}
})
}
}
func makeBody(配置:Self.configuration)->一些视图{
CustomButtonStyleView{configuration.label}
}
}
struct TestOnHoverButton: View {
    var body: some View {
        Button("Button") {}
            .buttonStyle(CustomButtonStyle())
    }
}

struct CustomButtonStyle: ButtonStyle {

    private struct CustomButtonStyleView<V: View>: View {
        @State private var isOverButton = false

        let content: () -> V

        var body: some View {
            ZStack {
                content()
                    .frame(minWidth: 0, maxWidth: .infinity)
                    .padding()
                    .foregroundColor(.white)
                    .background(Color.blue)
            }
            .padding(3)
            .onHover { over in
                self.isOverButton = over
                print("isOverButton:", self.isOverButton, "over:", over)
            }
            .overlay(VStack {
                if self.isOverButton {
                    Rectangle()
                        .stroke(Color.blue, lineWidth: 2)
                } else {
                    EmptyView()
                }
            })
        }
    }

    func makeBody(configuration: Self.Configuration) -> some View {
        CustomButtonStyleView { configuration.label }
    }
}