在 SwiftUI 中,当从 .large 样式移动到 .inline 样式时,BarTitleDisplayMode 会跳转

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

看看推送的视图有一个空的大标题,在动画完成后消失(视频在模拟器上拍摄,在设备上也会发生同样的情况):

这是 SwiftUI 教程(HandlingUserInput 项目)中的 Apple 示例项目,它没有变化。这是一些代码:

// Parent view
struct LandmarksView: View {
    var body: some View {
        NavigationSplitView {
            List {
                ForEach(filteredLandmarks) { landmark in
                    NavigationLink {
                        LandmarkDetail(landmark: landmark)
                    } label: {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
            .navigationTitle("Landmarks") // <----- Parent title
            .navigationBarTitleDisplayMode(.large) // <----- Large style        
        } detail: {
            Text("Select a Landmark")
        }
    }
}

// Child view
struct LandmarkDetail: View {
    var body: some View {
        ScrollView { // <--- The actual container and its content doesn't matter
            // ...
        }
        .navigationTitle(landmark.name) // <--- Child title
        .navigationBarTitleDisplayMode(.inline) // <--- The inline style
    }
}

我在互联网上搜索并发现了它要么是Apple bug要么是Apple不打算将导航控制器从大到内联使用所以你总是使用大或内联,但不能同时使用两者。

有人可以解释一下它到底是什么以及是否有解决方法?

swift swiftui
1个回答
0
投票

我最近遇到了类似的问题,并通过使用相同的孩子们的

TitleDisplayMode
来解决
detail
争论。应用于您的示例,这将变为以下内容。 (使用您提到的 HandlingUserInput 教程检查代码。) // Parent view struct LandmarksView: View { var body: some View { NavigationSplitView { List { ForEach(filteredLandmarks) { landmark in NavigationLink { LandmarkDetail(landmark: landmark) } label: { LandmarkRow(landmark: landmark) } } } .navigationTitle("Landmarks") .navigationBarTitleDisplayMode(.large) } detail: { Text("Select a Landmark") .navigationBarTitleDisplayMode(.inline) // <---— Line added } } }

看起来 
NavigationSplitView

使用

TitleDisplayMode
内部内容的
detail: { }
来预测如何过渡到实际的导航目的地。
仍然存在的一个错误是,如果地标名称很长(例如,

Silver Salmon Creek

),后退按钮最初会显示“地标”,并且只有在显示 LandmarkDetail 视图时才会被剪辑为“后退”。似乎

NavigationSplitView
无法像
NavigationStack
那样预测工具栏的间距。
此问题
中也报告了此行为。

© www.soinside.com 2019 - 2024. All rights reserved.