繁体   English   中英

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

Changing the color of a Button in SwiftUI on tvOS

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试更改 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)
        }
    }
}

一个相关的问题是更改“焦点”视图的颜色,因为我怀疑这是与按钮本身相同的视图,转换了大小和颜色。

带有UIButton tvOS 中的典型技术是更改按钮图像,但似乎没有任何方法可以访问底层UIButton的图像。

4 个回复

同样,我只在 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()。

这段代码在 iOS 上似乎运行良好,但正如您所展示的,在 tvOS 中,底层 UIButton 是可见的。 我不确定如何获取底层按钮或其图像,但似乎您现在可以破解它(直到 Apple 修复该问题或提供获取该按钮的方法。)

首先,将内边距向上移动以修改文本,使其正确影响底层按钮。

其次,(这是 hack)在背景修改器之后用一个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)
    }
}

这是 Swift 5.5 tvOS的有效解决方案

struct TVButton: View {

// MARK: - Variables
@FocusState private var isFocused: Bool
@State private var buttonScale: CGFloat = 1.0
var title: String?
var bgColor: Color = .white
var action: () -> Void

// MARK: - Body
var body: some View {
    TVRepresentableButton(title: title, color: UIColor(bgColor)) {
        action()
    }
    .focused($isFocused)
    .onChange(of: isFocused) { newValue in
        withAnimation(Animation.linear(duration: 0.2)) {
            buttonScale = newValue ? 1.1 : 1.0
        }
    }
    .scaleEffect(buttonScale)
}
}

struct TVRepresentableButton: UIViewRepresentable {

// MARK: - Typealias
typealias UIViewType = UIButton

// MARK: - Variables
var title: String?
var color: UIColor
var action: () -> Void

func makeUIView(context: Context) -> UIButton {
    let button = UIButton(type: .system)
    button.setBackgroundImage(UIImage(color: color), for: .normal)
    button.setBackgroundImage(UIImage(color: color.withAlphaComponent(0.85)), for: .focused)
    button.setBackgroundImage(UIImage(color: color), for: .highlighted)
    button.setTitle(title, for: .normal)
    button.addAction(.init(handler: { _ in action() }), for: .allEvents)
    
    return button
}

    func updateUIView(_ uiView: UIButton, context: Context) {}
}

extension UIImage {
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    let rect = CGRect(origin: .zero, size: size)
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
    color.setFill()
    UIRectFill(rect)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    guard let cgImage = image?.cgImage else { return nil }
    self.init(cgImage: cgImage)
}
}

现在您可以在tvOS上更改标题、背景颜色、比例和处理点击动作

尝试:

button.setBackgroundImage(UIImage.imageWithColor(.lightGray), for: .normal)

您可以将其设置为.focused.highlighted

1 SwiftUI tvOS 按钮 - 视差?

使用来自 Apple 的地标示例代码。 我让我的应用程序像这样运行: https : //youtu.be/CLL_oknQEDI?t=1118 但是,如何在按钮/导航链接上实现“视差”效果? 如果您在焦点按钮上,则无法摆动它。 就像商店中的所有其他 AppleTV 按钮一样。在按钮或导航链接上 ...

2 SwiftUI tvOS 按钮/NavigationLink .focusable()

我有一个直接的跨平台 SwiftUI 项目。 我很难在 tvOS 上使用NavigationLink 。 (以下均为伪代码,可能有错别字) 以这个为例,这很好用: struct ContentView: View { var body: some View { Navigation ...

3 自定义按钮样式 (SwiftUI) tvOS

所以我有一个自定义按钮类(这样我就可以删除所有徽标背后的背景。) 但是现在当用户将鼠标悬停在按钮上时缩放不起作用/激活 - 这意味着他们不知道他们在哪个按钮上。 我想知道如何在遥控器上方或按钮上添加增加按钮大小(宽度和高度)的功能? 和按钮代码 我已经确定我可以使用这个 但它不会缩放 ...

4 SwiftUI 按钮大小/形状/颜色不变

我正在尝试使用 SwiftUI 为 MacOS 应用程序制作自定义按钮,但是,我似乎无法调整按钮区域的大小,并且按钮的颜色似乎不可更改。 我在网上找到的所有示例都说使用 .frame 或 .padding 来设置宽度和高度,但这不会改变按钮的形状。 有没有其他人在开发 MacOS 应用程序时遇到过这 ...

5 更改按钮颜色会破坏 Appkit SwiftUI 中的格式

我是一名 web 开发人员,试图做一个简单的 SwiftUI 应用程序,我在问这里之前用谷歌搜索了这个,但我仍然遇到麻烦。 这是我正在做的一个小应用程序的用户界面。 我想更改按钮的颜色。 这是我在网上阅读了一些示例后正在尝试的代码: 当我向文本添加填充时,一切看起来都错了,我对默认按钮的形 ...

6 根据禁用与否更改 SwiftUI 中按钮的颜色

我有一个带有发送按钮的文本字段,它是一个 systemImage 箭头。 我希望图像的前景色根据 textField 是否为空而改变。 (即按钮是灰色的,如果文本字段为空,它被禁用。如果文本字段文本的计数大于 1,它是蓝色的)。 我有一个不完美的解决方法: if chatMessageIsVa ...

7 tvOS SwiftUI TabView动态更改条形颜色

我有一个顶部带有TabView的tvOS应用程序。 我想使用TabView的背景色来指示状态。 最初它将是红色,并且当其中一个视图中发生某些事情时,我想将TabView的背景色更改为绿色。 我在init()使用UITabBar.appearance().barTintColor = UIColor ...

8 如何使用 SwiftUI 在 tvOS 中按下样式按钮时做出反应

如果您在 tvOS 中为 Button 元素设置样式,则必须按照本文所述手动管理焦点: https://stackoverflow.com/a/58179225/10826194 不幸的是,附加到按钮上的操作永远不会被调用。 此外,tvOS 上没有 TapGesture。 如何将操作附加到样式 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM