Как исправить наложение последнего элемента TabView в альбомном режиме? - PullRequest
1 голос
/ 12 февраля 2020

Я создаю приложение iPhone с SwiftUI и сталкиваюсь с проблемой макета: когда я тестирую свое приложение на устройстве или на симуляторе, в ландшафтном режиме происходит следующее: нижняя панель перекрывает последний элемент списка (отмечен красным на снимок экрана):

FirstView tab

Мое желание никогда не допускать этого, поэтому результат должен выглядеть следующим образом (отмечен зеленым на скриншоте):

SecondView tab

Подробная информация о приложении: на основе шаблона приложения Xcode iOS с вкладками приложения. 3 просмотра: ContentView.swift, FirstView.swift, SecondView.swift. Я добавил фиктивный список в FirstView.swift, чтобы проиллюстрировать проблему.

ContentView.swift код:

struct ContentView: View {
    @State private var selection = 0

    var body: some View {
        TabView(selection: $selection){
            FirstView()
                .tabItem {
                    VStack {
                        Image("first")
                        Text("First")
                    }
                }
                .tag(0)
            SecondView()
                .tabItem {
                    VStack {
                        Image("second")
                        Text("Second")
                    }
                }
                .tag(1)
        }
    }
}

FirstView.swift код:

import SwiftUI

struct FirstView: View {
    var body: some View {
        NavigationView {
            List(0..<10) { item in
                Image(systemName: "photo")

                VStack(alignment: .leading) {
                    Text("Hello")
                }
            }
            .navigationBarTitle("First View Title")
        }

    }
}

SecondView.swift code:

import SwiftUI

struct SecondView: View {
    var body: some View {
        NavigationView {
            Text("Second View")
            .navigationBarTitle("Second View Title")
        }
    }
}

Я нашел обходной путь, но это не то, как я хочу, чтобы он работал: если я перевожу устройство в альбомный режим, нажмите вкладку SecondView, а затем нажмите FirstView, нажмите и прокрутите список сверху вниз панель вкладок не перекрывает последний элемент списка. Есть ли способ исправить перекрытие TabView последнего элемента списка в ландшафтном режиме? Спасибо.

UPD : добавлено func scene() из SceneDelegate.swift:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

    // Get the managed object context from the shared persistent container.
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
    // Add `@Environment(\.managedObjectContext)` in the views that will need the context.
    let contentView = ContentView().environment(\.managedObjectContext, context)

    // Use a UIHostingController as window root view controller.
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: contentView)
        self.window = window
        window.makeKeyAndVisible()
    }
}

1 Ответ

0 голосов
/ 13 февраля 2020

Шаг 1 :
В вашем файле ContentView.swift вы можете создать переменную внутри структуры с именем

var isLandscape: Bool = false

(сделать это выше var body: ....)


Шаг 2 :

Затем go в файл SceneDelegate.swift и вставьте следующее

 let window = UIWindow(windowScene: windowScene) <---- after this line insert
                                                       what is shown below

 contentView.isLandscape = windowScene.interfaceOrientation.isLandscape

Также убедитесь, что вы изменили объявление let contentView на var, потому что мы существенно изменив структуру при передаче свойства isLandscape.

Шаг 3 :

Теперь, когда у вас есть доступ к ландшафтному логическому значению в вашем contentView, вы можете сместить FirstView на небольшое значение, например 20 или что-то еще, с помощью троичной проверки свойства, чтобы сделать его простым и приятным

как ....

              FirstView()
                .offset(x:0 , y: isLandscape ? 20 : 0)
                .tabItem {
                    VStack {
                        Image("first")
                        Text("First")
                    }
                }
                .tag(0)

20 просто отсутствует go моя голова. Вам нужно будет проверить методом проб и ударов, чтобы узнать наиболее подходящее значение.

Надеюсь, что это поможет!

Прокомментируйте свои сомнения ниже:)

РЕДАКТИРОВАТЬ ДЛЯ ВАШЕ СКАКЕ

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        var contentView = ContentView()
        contentView.isLandscape = windowScene.interfaceOrientation.isLandscape
        window.rootViewController = UIHostingController(rootView: contentView.environmentObject(settings))
        self.window = window
        window.makeKeyAndVisible()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...