我正在尝试在tvOS上更改SwiftUI Button
的颜色。
修改background
几乎可以工作,除了您可以看到底层的UIButton
实际上是在背景顶部使用了一个圆形的半透明图像。这样会在矩形背景位于圆形图像外部的角落处产生不同的颜色。
添加.padding
强调了这个问题:
struct ContentView: View {
@State
var selected = false
var body: some View {
Button(action: {
self.selected.toggle()
}) {
Text($selected.wrappedValue ? "On":"Off")
.foregroundColor(.white)
}.padding(.all)
.background(self.selected ? Color.green : Color.blue)
}
}
}
一个相关的问题是更改“焦点”视图的颜色,因为我怀疑这是与按钮本身相同的视图,变换了获胜大小和颜色。
tvOS中带有UIButton
的典型技术是更改按钮图像,但是似乎没有任何方法可以访问基础UIButton
的图像。
答案 0 :(得分:3)
同样,我只在iOS上进行过检查,但这应该会有所帮助:
struct ContentView: View {
@State var selected = false
var body: some View {
Button(action: { self.selected.toggle() }) {
Text($selected.wrappedValue ? "On":"Off")
.foregroundColor(.white)
} .padding(.all)
.background(RoundedRectangle(cornerRadius: 5.0)
.fill(self.selected ? Color.green : Color.blue))
}
}
您可以将任何视图传递到.background()修饰符,因此您可能还想尝试在其中放置Image()。
答案 1 :(得分:1)
此代码在iOS上似乎可以正常运行,但是,如您所显示的,在tvOS中,底层的UIButton是可见的。我不确定如何获取底层按钮或其图像,但似乎您可以立即对其进行破解(直到Apple修复此问题或提供一种获取该按钮的方法为止。)
首先,向上移动填充以修改文本,以使其正确影响基础按钮。
第二,(这就是技巧)在背景修饰符之后用cornerRadius裁剪视图。只要半径等于或大于基础按钮的半径,它就会裁剪掉多余的背景。 (当然,您看到的不是绿色,而是绿色叠加在半透明按钮图像的灰色上所产生的颜色。至少这就是它在Xcode中的显示方式。)
struct ContentView: View {
@State var selected = false
var body: some View {
Button(action: {
self.selected.toggle()
}) {
Text($selected.wrappedValue ? "On":"Off")
.foregroundColor(.white)
.padding(.all)
}
.background(self.selected ? Color.green : Color.blue)
.cornerRadius(5)
}
}
答案 2 :(得分:-1)
尝试:
button.setBackgroundImage(UIImage.imageWithColor(.lightGray), for: .normal)
您可以将其用于.focused
和.highlighted