SwiftUI-带有NavigationView和Tab栏的屏幕位置问题

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

我正在将SwiftUI屏幕集成到tvOS的UIKit应用中。我在屏幕顶部有一个标签栏。首次运行该应用程序时,当我切换到SwiftUI屏幕时,它看起来像我想要的。但是,当我离开然后再返回时,整个屏幕向上移动,导航标题隐藏在选项卡栏下,并且屏幕上的内容都较高。 SwiftUI如下所示:

    struct SettingsVC: View {
    var body: some View {
        NavigationView {
            HStack {
                Image("fullLogo")
                    .resizable()
                    .scaledToFit()
                    .frame(width: 800, height: 450)
                    .padding()
                    .offset(y: -75)
                List {
                    NavigationLink(destination: Text("Test")) {
                        HStack {
                            Image(systemName: "link")
                                .font(.headline)
                            Text("Link Account")
                                .font(.headline)
                        }
                    }
                }
                .navigationBarTitle("Settings")
            }
        }
    }
}

如果我注释掉NavigationView,则切换到另一个选项卡并再次返回时,屏幕位置将保持在同一位置。但是,我需要标题导航并移至列表。我尝试删除其他元素(例如图像)只是为了查看它是否引起了问题,但事实并非如此。在此屏幕的后续选择中,似乎不再考虑导航栏。这种现象可能是什么原因?

这里是选项卡栏部分,它再次位于UIKit中。

private func setup() {
        self.view.insetsLayoutMarginsFromSafeArea = false

        let tvSelectionVC = TVSelectionVC()
        tvSelectionVC.screenType = .live
        tvSelectionVC.isFirstRun = true

        let onDemandVC = TVSelectionVC()
        onDemandVC.screenType = .demand
        onDemandVC.isFirstRun = false

        let settingsVC = SettingsVC()
        let settingsHostController = UIHostingController(rootView: settingsVC)
        let config = UIImage.SymbolConfiguration(pointSize: 50, weight: .bold)

        tvSelectionVC.tabBarItem = UITabBarItem(title: "Live", image: nil, tag: 0)
        onDemandVC.tabBarItem = UITabBarItem(title: "OnDemand", image: nil, tag: 1)
        settingsHostController.tabBarItem.image = UIImage(systemName: "gear",withConfiguration: config)

        let logoView = UIImageView(image: UIImage(named: "logo"))
        logoView.translatesAutoresizingMaskIntoConstraints = false
        tabBar.leadingAccessoryView.addSubview(logoView)
        logoView.topAnchor.constraint(equalTo: tabBar.leadingAccessoryView.topAnchor).isActive = true
        logoView.leadingAnchor.constraint(equalTo: tabBar.leadingAccessoryView.leadingAnchor, constant: 0).isActive = true
        logoView.heightAnchor.constraint(equalToConstant: 40).isActive = true
        logoView.widthAnchor.constraint(equalToConstant: 140).isActive = true

        viewControllers = [tvSelectionVC,onDemandVC,settingsHostController]
    }

更新:我可以从SwiftUI视图中删除所有内容,并且只有Text位于NavigationView之内,问题仍然存在。我还可以将第一个和第二个选项卡更改为空的UIViewControllers,并且在第一次切换到SwiftUI时仍然会发生此问题。

swift swiftui tvos navigationview
1个回答
0
投票

我能够通过将NavigationView标记包装在VStack标记内并添加解决此问题所需的Spacer来解决此问题。有趣的是,作为一个测试,我创建了一个SwiftUI标签栏,其中前两个标签进入了空视图,第三个标签进入了上方的设置。这也表现出与上述相同的问题,表明该问题与将SwiftUI包装在UIKit标签栏中无关。我不清楚为什么需要这种解决方案,但确实解决了问题。这是SwiftUI再次提供了此问题的完整解决方案。

struct SettingsVC: View {
    var body: some View {
        VStack {
            Spacer()
            NavigationView {
                HStack {
                    Image("fullLogo")
                        .resizable()
                        .scaledToFit()
                        .frame(width: 800, height: 450)
                        .padding()
                        .offset(y: -75)
                    List {
                        NavigationLink(destination: Text("Test")) {
                            HStack {
                                Image(systemName: "link")
                                    .font(.headline)
                                Text("Link Account")
                                    .font(.headline)
                            }
                        }
                    }
                    .padding()
                    .navigationBarTitle("Settings")
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.