You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tvOS SwiftUI添加NavigationLink后按钮焦点动画消失求助

解决tvOS SwiftUI中NavigationLink包裹Button后焦点动画消失的问题

问题原因

当用NavigationLink直接包裹Button时,tvOS的焦点会转移到NavigationLink本身,内部Button无法获得焦点,导致原本的放大动画失效。

解决方案

方案1:直接用NavigationLink替代Button(推荐)

tvOS的NavigationLink原生支持焦点动画,可直接将原Button的内容作为NavigationLink的label,无需嵌套Button:

var body: some View {
    NavigationView {
        ScrollView(.horizontal) {
            LazyHStack(spacing: 50) {
                ForEach(sections[0].items) { item in
                    NavigationLink(destination: VideoDetailView(mediaItem: item)) {
                        Image(systemName: "photo")
                            .resizable()
                            .frame(width: 300, height: 170)
                        Text(item.title)
                    }
                    .buttonStyle(.borderless)
                }
            }
        }
        .scrollClipDisabled()
    }
}

方案2:通过绑定控制隐藏的NavigationLink(保留Button逻辑)

若需保留Button的自定义操作(如跳转前的额外处理),可使用isActive绑定控制隐藏的NavigationLink,让Button保持焦点:

struct YourView: View {
    @State private var isNavigating = false
    
    var body: some View {
        NavigationView {
            ScrollView(.horizontal) {
                LazyHStack(spacing: 50) {
                    ForEach(sections[0].items) { item in
                        Button {
                            // 添加自定义逻辑
                            isNavigating = true
                        } label: {
                            Image(systemName: "photo")
                                .resizable()
                                .frame(width: 300, height: 170)
                            Text(item.title)
                        }
                        .buttonStyle(.borderless)
                        
                        NavigationLink(
                            destination: VideoDetailView(mediaItem: item),
                            isActive: $isNavigating
                        ) {
                            EmptyView()
                        }
                        .hidden()
                    }
                }
            }
            .scrollClipDisabled()
        }
    }
}

说明

  • 方案1更简洁,符合tvOS原生组件设计,优先推荐使用。
  • 方案2适合需要在跳转前执行额外操作的场景,比如数据统计、状态更新等。

内容的提问来源于stack exchange,提问作者cesarcarlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:07:12