在tvOS上的SwiftUI中更改按钮的颜色

时间:2019-09-18 22:13:34

标签: swift button swiftui tvos

我正在尝试在tvOS上更改SwiftUI Button的颜色。

修改background几乎可以工作,除了您可以看到底层的UIButton实际上是在背景顶部使用了一个圆形的半透明图像。这样会在矩形背景位于圆形图像外部的角落处产生不同的颜色。

enter image description here

添加.padding强调了这个问题:

enter image description here

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的图像。

3 个答案:

答案 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