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