【问题标题】:tvOS, .contextMenu and .ButtonStyle not working togethertvOS、.contextMenu 和 .ButtonStyle 不能一起工作
【发布时间】:2022-10-06 01:53:51
【问题描述】:

使用电视操作系统

我试图在用户长按按钮时出现上下文菜单。

如果我不使用 .buttonStyle() 或使用内置按钮样式之一,则会出现 contextMenu。

但是,我想使用自定义按钮样式。当我这样做时, .contextMenu 被忽略。

这是我的基本代码:

import SwiftUI

struct TestButtonStyle: ButtonStyle {
    @Environment(\\.isFocused) var focused: Bool
    @State private var isFocused: Bool = false

    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .padding()
            .frame(height: 50)
            .background(RoundedRectangle(cornerRadius: 20).fill(isFocused ? .red.opacity(0.75) : .clear))
            .onChange(of: focused) { hasFocus in
                if hasFocus {
                    isFocused = true
                } else {
                    isFocused = false
                }
            }
    }
}

struct ContentView: View {
    var body: some View {
        HStack {
            Button {
                print(\"Button 1 Pressed\")
            } label: {
                Text(\"Button 1\")
            }
            .buttonStyle(TestButtonStyle())
            .contextMenu {
                Button {
                    //
                } label: {
                    Text(\"Option 1\")
                }
                Button {
                    //
                } label: {
                    Text(\"Option 2\")
                }
            }

            Button {
                print(\"Button 2 Pressed\")
            } label: {
                Text(\"Button 2\")
            }
            .contextMenu {
                Button {
                    //
                } label: {
                    Text(\"Option 3\")
                }
                Button {
                    //
                } label: {
                    Text(\"Option 4\")
                }
            }
            .buttonStyle(TestButtonStyle())
        }
    }
}

有没有人遇到过这个并解决了?谢谢。

  • 作为未来参考,这已在 tvOS 16 Beta 4 中得到修复。
  • 在发布的 tvOS 16 中再次崩溃。我向苹果提交了反馈。

标签: swiftui tvos


【解决方案1】:

我找到了解决这个问题的方法。

struct MoviesBlankButtonStyle: PrimitiveButtonStyle {
    @Environment(\.isFocused) var focused: Bool
    @State private var isFocused: Bool = false
    
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .compositingGroup()
            .padding(.all, 9)
            .focusable(true, onFocusChange: { focused in
                if focused {
                    isFocused = true
                } else {
                    isFocused = false
                }
            })
            .background(RoundedRectangle(cornerRadius: 20).fill(isFocused ? .red : .clear).opacity(0.7 ))
            .foregroundColor(isFocused ? .white : .white)
            .onTapGesture(perform: configuration.trigger)
    }
}

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2019-08-17
    • 2016-11-23
    • 2019-02-18
    • 2015-05-16
    • 2017-10-14
    • 2012-06-01
    • 2011-11-05
    • 2018-05-20
    相关资源
    最近更新 更多