在 SwiftUI 中使用 .focused( :equals) 使自定义视图在 tvOS 中可聚焦

问题描述 投票:0回答:1

我有一个非常简单的自定义视图,它只包含一个 RoundedRectangle:

public struct SimpleView: View {

    @State public var focused = false

    public var body: some View {
        RoundedRectangle(cornerRadius: 20)
            .fill(.green)
            .scaleEffect( focused ? 1.0 : 0.8 )
            .animation(.easeInOut, value: focused)
    }
}

我必须在容器视图中看到这个

SimpleView
的实例:

public enum EnumView: Hashable { 案例一 案例二 案例三 }

public struct GalleryView: View {

    var s1 = SimpleView()
    var s2 = SimpleView()
    var s3 = SimpleView()

    @FocusState var fokus: EnumView?

    public init() {

    }

    public var body: some View {
        HStack(alignment: .center) {
            s1.focused($fokus, equals: .one)
                .onChange(of: fokus) { newFocusedField in
                    log.info("| New focus \(newFocusedField)")

                }
            s2.focused($fokus, equals: .two)
                .onChange(of: fokus) { newFocusedField in
                    log.info("| New focus \(newFocusedField)")

                }

            s3.focused($fokus, equals: .three)
                .onChange(of: fokus) { newFocusedField in
                    log.info("| New focus \(newFocusedField)")

                }
        }

    }
}

在我使用“

focusable(true)
”-
SimpleView
中的修饰符之前,它允许我在三个子视图之间移动焦点,这些子视图根据焦点所在的位置进行扩展或缩小。

根据 Apple 的说法,“

focusable(true)
”- 修饰符已被弃用 所以我想用新的 "focused(... , equals: )"
 - 修饰符替换此解决方案。

但经过两天多的尝试,我仍然无法正常工作。例如,当我使用 Buttons 而不是我的自定义视图时,它会起作用。

基本上我想水平移动焦点,视图应该根据它们当前的焦点状态扩大或缩小。

任何想法谁来实现这个?

谢谢!

swift swiftui view focus tvos
1个回答
0
投票
我设法通过使用圆角矩形作为按钮的标签来解决这个问题。所以这现在有效:

public struct SimpleView: View { public var body: some View { VStack(alignment: .center) { GeometryReader { proxy in Button( action: {} , label: { ZStack(alignment: .center) { RoundedRectangle(cornerRadius: 12.5) .fill(.green) } ).buttonStyle(.card) } } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.