SwiftUI - проблема положения экрана с NavigationView и панелью вкладок - PullRequest
1 голос
/ 17 апреля 2020

Я интегрирую экран SwiftUI в приложение UIKit для tvOS. У меня есть панель вкладок в верхней части экрана. Когда приложение запускается впервые, и я переключаюсь на экран 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 после первого раза.

1 Ответ

0 голосов
/ 17 апреля 2020

Мне удалось решить проблему, обернув тег 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")
                }
            }
        }
    }
}
...