SwiftUI拆分视图大标题在iPad上不起作用

时间:2019-09-26 20:29:20

标签: ios swift swiftui

我正在尝试使用SwiftUI在iOS上使用边栏和详细视图构建一个非常简单的布局。但是,似乎不可能在iPad的详细信息视图中拥有较大的标题。它实际上应该看起来像Apple的Reminders应用程序。

我想要什么(详细视图中的蓝色文本提醒): This is what I want, the text 'Reminders' is a large title in a detail view

但是,在我自己的应用程序中,它不起作用。我发现苹果公司的这个例子涉及建立列表和导航:https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation

但是它在那里也不起作用。即使我这样在LandmarkDetail.swift中设置标题,也是如此:

VStack {
    MapView(coordinate: landmark.locationCoordinate)
        .frame(height: 300)

    CircleImage(image: landmark.image)
        .offset(x: 0, y: -130)
        .padding(.bottom, -130)

    VStack(alignment: .leading) {
        Text(landmark.name)
            .font(.title)

        HStack(alignment: .top) {
            Text(landmark.park)
                .font(.subheadline)
            Spacer()
            Text(landmark.state)
                .font(.subheadline)
        }
    }
    .padding()

    Spacer()
}
.navigationBarTitle(Text(verbatim: landmark.name), displayMode: .large)

我在iPhone上对其进行了测试,并且可以正常工作。我还添加了另一个NavigationView细节,但这只会使整个情况变得更糟。我的标题很大,但是标题出现在另一个导航栏的下方,因此顶部有很大的空白。

2 个答案:

答案 0 :(得分:1)

我确实尝试了一种类似的方法来将大标题保留在拆分视图的两侧,但是失败了。因此,我想您可以尝试在右侧添加自定义视图。您可以在HStack中添加NavigationView并可以安排如下的视图screenshot

这是代码

    var body: some View {
        HStack{
        NavigationView {
        List(landmarkData) { landmark in
            NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                LandmarkRow(landmark: landmark)
            }.isDetailLink(false)
        }
        .navigationBarTitle(Text("Landmarks"), displayMode: .large)
        }
        NavigationView {
            List(landmarkData) { landmark in
                NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                    LandmarkRow(landmark: landmark)
                }.isDetailLink(false)
            }
            .navigationBarTitle(Text("Landmarks"), displayMode: .large)
        }
        NavigationView {
            LandmarkDetail(landmark: landmarkData[0])
            .navigationBarTitle(Text("Landmarks"), displayMode: .large)
        }
    }
}

注意:目前,iPad的两面都不支持大标题。

答案 1 :(得分:0)

使用Xcode 11.1,该问题似乎已解决。我曾就此问题与苹果公司联系。他们说我应该报告现在不再需要的错误。

我使用了以下代码:

NavigationView {
    VStack {
        MapView(coordinate: landmark.locationCoordinate)
            .frame(height: 300)

        CircleImage(image: landmark.image)
            .offset(x: 0, y: -130)
            .padding(.bottom, -130)

        VStack(alignment: .leading) {
            Text(landmark.name)
                .font(.title)

            HStack(alignment: .top) {
                Text(landmark.park)
                    .font(.subheadline)
                Spacer()
                Text(landmark.state)
                    .font(.subheadline)
            }
        }
        .padding()

        Spacer()
    }
    .navigationBarTitle(Text(verbatim: landmark.name), displayMode: .large)
}
.navigationBarTitle("")
.navigationBarHidden(true)
.navigationViewStyle(StackNavigationViewStyle())

在详细信息屏幕周围添加NavigationView本身非常重要。否则,大标题将不起作用。如此一来,您最终将获得两个导航栏和一个很大的空白。

但是,当您在导航视图本身上使用.navigationBarHidden(true)和{非常重要!!).navigationBarTitle("")时,似乎会隐藏第一个导航栏,最终会导致布局变大细节视图中的标题,没有任何额外的边距或奇怪的行为。

其他信息:了解这些规则在何处存在区别是非常重要的。当您在NavigationView内部内部调用导航栏修饰符时,它将应用该导航视图的导航栏规则。但是,当您直接在导航视图上调用它时(就像我对上面的hide和empty标题所做的那样),那么这些修饰符将定位到下一个外部导航栏。

编辑:似乎需要将.navigationViewStyle(StackNavigationViewStyle())添加到内部导航视图中,例如Xcode 11.2 /最新的iPadOS版本。我已经在上面的代码中添加了它。