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

SwiftUI NavigationSplitView iPad侧边栏大标题初始显示异常问题

iPad上SwiftUI NavigationSplitView侧边栏大标题初始显示异常问题

在iPad设备上使用SwiftUI的NavigationSplitView时,侧边栏出现标题显示异常:已设置.navigationBarTitleDisplayMode(.large),但应用首次启动时标题以inline样式显示,只有下拉列表(向上滚动)后才切换为大标题。视觉上列表完全可见,却仿佛初始处于上滚状态。

示例代码

NavigationSplitView {
    VStack {
        List(folders, id: \.self, selection: $selectedFolder) { folder in
            NavigationLink(folder.title, value: folder)
        }
        .navigationTitle("Test Title")
        .navigationBarTitleDisplayMode(.large)
        
        Spacer()
        
        Button {
            // 创建新列表
            newListModalShown = true
        } label: {
            Text("New List")
        }
    }
} detail: {
    if let selectedFolder {
        ItemsListView(folder: selectedFolder)
    } else {
        Text("Select a list")
            .navigationTitle("")
            .navigationBarTitleDisplayMode(.inline)
    }
}

已尝试的排查步骤(未解决)

  • 将List内容替换为Text,标题仍无法正常显示大标题;
  • 使用ScrollView可正常显示大标题,但希望保留List组件;
  • 调整.navigationBarTitleDisplayMode修饰器的位置,无变化。

解决方案

这是SwiftUI的已知布局Bug,以下两种方案均有效,方案1更贴合需求:

方案1:调整导航栏配置的作用范围

将.navigationTitle和.navigationBarTitleDisplayMode从List移至外层VStack,确保配置作用于整个侧边栏容器:

NavigationSplitView {
    VStack {
        List(folders, id: \.self, selection: $selectedFolder) { folder in
            NavigationLink(folder.title, value: folder)
        }
        
        Spacer()
        
        Button {
            newListModalShown = true
        } label: {
            Text("New List")
        }
    }
    .navigationTitle("Test Title")
    .navigationBarTitleDisplayMode(.large)
} detail: {
    if let selectedFolder {
        ItemsListView(folder: selectedFolder)
    } else {
        Text("Select a list")
            .navigationTitle("")
            .navigationBarTitleDisplayMode(.inline)
    }
}

方案2:强制List初始滚动到顶部

通过scrollPosition绑定,强制List初始滚动到第一个元素,触发大标题显示:

@State private var scrollPosition: String? = nil // 根据folder的id类型调整

NavigationSplitView {
    VStack {
        List(folders, id: \.self, selection: $selectedFolder, scrollPosition: $scrollPosition) { folder in
            NavigationLink(folder.title, value: folder)
        }
        .navigationTitle("Test Title")
        .navigationBarTitleDisplayMode(.large)
        .onAppear {
            scrollPosition = folders.first?.id
        }
        
        Spacer()
        
        Button {
            newListModalShown = true
        } label: {
            Text("New List")
        }
    }
} detail: {
    if let selectedFolder {
        ItemsListView(folder: selectedFolder)
    } else {
        Text("Select a list")
            .navigationTitle("")
            .navigationBarTitleDisplayMode(.inline)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:43:14