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

SwiftUI中Navigation Link的Frame高度不生效问题求助

问题

我尝试调整Navigation Link的尺寸,以适配Navigation Stack中的多个链接。Frame宽度设置生效,但高度设置无效。我尝试将frame配置放在不同位置,但都没有效果。以下是我的代码:

import SwiftUI

struct MenuView: View {

    var body: some View {
        
        NavigationStack{
            Text("Game Logger")
                .padding(.top,0)
            VStack{
                NavigationLink {
                    GameView()
                }label: {
                    VStack {
                        Label("Start Game", systemImage: "")
                            .dynamicTypeSize(/*@START_MENU_TOKEN@*/.xSmall/*@END_MENU_TOKEN@*/)
                            .font(.callout)
                    }
                    .controlSize(/*@START_MENU_TOKEN@*/.mini/*@END_MENU_TOKEN@*/)
                    .padding(.top, 0)
                }
                .frame(width: 100)
                .frame(height: 20)
                NavigationLink {
                    LiveStatisticsView()
                }label: {
                    VStack {
                        Label("Live Statistics", systemImage: "")
                            .dynamicTypeSize(/*@START_MENU_TOKEN@*/.xSmall/*@END_MENU_TOKEN@*/)
                            .font(.callout)
                    }
                    .frame( width: 100, height: 5)
                    //.border(Color.blue, width: 2)
                    .padding(.top, 0)
                }
                NavigationLink {
                    StatisticsView()
                }label: {
                    VStack {
                        Label("Statistics", systemImage: "")
                        .dynamicTypeSize(/*@START_MENU_TOKEN@*/.xSmall/*@END_MENU_TOKEN@*/)
                        .font(.callout)
                    }
                    .frame(width: 100, height: 20)
                    .padding(.top, 0)
                }
                NavigationLink {
                    UtilitiesView()
                }label: {
                    VStack {
                        Label("Utilities", systemImage: "")
                            .dynamicTypeSize(/*@START_MENU_TOKEN@*/.xSmall/*@END_MENU_TOKEN@*/)
                            .font(.callout)
                    }
                    .frame(width: 100, height: 0)
                    .padding(.top, 0)
                }
            }
        }
    }
}

从截图可见宽度设置生效,但高度未生效,请问我哪里操作有误?

解决方案

问题出在NavigationLink的默认按钮样式约束以及冗余的布局层级上:

  1. NavigationLink默认使用DefaultButtonStyle,这个样式会强制添加最小高度限制,导致手动设置的height参数被系统忽略。
  2. 额外嵌套的VStack会自动根据内容调整高度,抵消了你设置的frame效果;同时Label本身带有默认内边距,也会影响最终高度。

修改方案如下:

import SwiftUI

struct MenuView: View {
    var body: some View {
        NavigationStack{
            Text("Game Logger")
                .padding(.top, 0)
            // 调整VStack间距来控制链接之间的垂直距离
            VStack(spacing: 4) { 
                NavigationLink {
                    GameView()
                } label: {
                    Label("Start Game", systemImage: "")
                        .dynamicTypeSize(.xSmall)
                        .font(.callout)
                        .frame(width: 100, height: 20) // 直接给Label设置目标尺寸
                }
                .buttonStyle(PlainButtonStyle()) // 移除默认按钮的最小高度约束
                
                NavigationLink {
                    LiveStatisticsView()
                } label: {
                    Label("Live Statistics", systemImage: "")
                        .dynamicTypeSize(.xSmall)
                        .font(.callout)
                        .frame(width: 100, height: 20)
                }
                .buttonStyle(PlainButtonStyle())
                
                NavigationLink {
                    StatisticsView()
                } label: {
                    Label("Statistics", systemImage: "")
                        .dynamicTypeSize(.xSmall)
                        .font(.callout)
                        .frame(width: 100, height: 20)
                }
                .buttonStyle(PlainButtonStyle())
                
                NavigationLink {
                    UtilitiesView()
                } label: {
                    Label("Utilities", systemImage: "")
                        .dynamicTypeSize(.xSmall)
                        .font(.callout)
                        .frame(width: 100, height: 20)
                }
                .buttonStyle(PlainButtonStyle())
            }
        }
    }
}

关键修改点:

  • 添加.buttonStyle(PlainButtonStyle()),彻底移除NavigationLink默认的按钮样式约束,让自定义frame生效
  • 去掉冗余的VStack嵌套,直接给Label设置frame,减少布局层级的干扰
  • 调整外层VStack的spacing参数,控制各个NavigationLink之间的垂直间距,替代无效的padding设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:06:01