SwiftUI:未触发自定义按钮的操作
SwiftUI: Action of custom button not triggered
使用 SwiftUI 在 tvOS 上测试一些东西。当我将自定义样式添加到按钮时,按钮的 "action" 没有被触发。在这个例子中,我想打印 "pressed",但是添加函数也不起作用。
是否也可以实现自定义操作触发器或者我做错了什么?
澄清为什么我想要自定义按钮样式。
当我不使用任何 buttonstyle 时,"action" 可以正常工作,但永远不会调用 "onFocusChange" 函数。我需要什么!
但是..当我使用 buttonstyle 时,onFocusChange 正在工作,但动作不是.....
struct CustomButton: View {
@State private var buttonFocus: Bool = false
var body: some View {
VStack(alignment: .center){
Button(action: {
print("pressed")
})
{
Text("Save")
}
.buttonStyle(TestButtonStyle(focused: buttonFocus))
.focusable(true, onFocusChange: { (changed) in
self.buttonFocus.toggle()
})
}
}
}
按钮样式:
struct TestButtonStyle: ButtonStyle {
let focused: Bool
public func makeBody(configuration: TestButtonStyle.Configuration) -> some View {
configuration.label
.foregroundColor(.white)
.background(RoundedRectangle(cornerRadius: 5).fill(Color.red))
.scaleEffect(focused ? 1.5 : 1.0)
}
}
它现在可以与 SwiftUI 2.0 一起使用。
您可以在要关注的视图上使用以下环境对象。
另外,添加一个 State 或 Binding 以冒泡到您的父视图。
@Environment(\.isFocused) var isFocused: Bool
@Binding var focusedValue: Bool
然后,你可以调用下面的修饰符,这个修饰符会在View是否获得焦点时被调用。在这里您更改 Binding 或 State 变量。
.onChange(of: isFocused, perform: { value in
self.focusedValue = value
})
最后,您可以使用您的 Binding 或 State 来修改您的 View。
.scaleEffect(self.focused ? 1.1 : 1)
.animation(.linear(duration: 0.1))
使用 SwiftUI 在 tvOS 上测试一些东西。当我将自定义样式添加到按钮时,按钮的 "action" 没有被触发。在这个例子中,我想打印 "pressed",但是添加函数也不起作用。
是否也可以实现自定义操作触发器或者我做错了什么?
澄清为什么我想要自定义按钮样式。
当我不使用任何 buttonstyle 时,"action" 可以正常工作,但永远不会调用 "onFocusChange" 函数。我需要什么!
但是..当我使用 buttonstyle 时,onFocusChange 正在工作,但动作不是.....
struct CustomButton: View {
@State private var buttonFocus: Bool = false
var body: some View {
VStack(alignment: .center){
Button(action: {
print("pressed")
})
{
Text("Save")
}
.buttonStyle(TestButtonStyle(focused: buttonFocus))
.focusable(true, onFocusChange: { (changed) in
self.buttonFocus.toggle()
})
}
}
}
按钮样式:
struct TestButtonStyle: ButtonStyle {
let focused: Bool
public func makeBody(configuration: TestButtonStyle.Configuration) -> some View {
configuration.label
.foregroundColor(.white)
.background(RoundedRectangle(cornerRadius: 5).fill(Color.red))
.scaleEffect(focused ? 1.5 : 1.0)
}
}
它现在可以与 SwiftUI 2.0 一起使用。 您可以在要关注的视图上使用以下环境对象。 另外,添加一个 State 或 Binding 以冒泡到您的父视图。
@Environment(\.isFocused) var isFocused: Bool
@Binding var focusedValue: Bool
然后,你可以调用下面的修饰符,这个修饰符会在View是否获得焦点时被调用。在这里您更改 Binding 或 State 变量。
.onChange(of: isFocused, perform: { value in
self.focusedValue = value
})
最后,您可以使用您的 Binding 或 State 来修改您的 View。
.scaleEffect(self.focused ? 1.1 : 1)
.animation(.linear(duration: 0.1))