Нажатие UIViewController в iOS 13 вызывает его перекрытие строки состояния - PullRequest
1 голос
/ 27 сентября 2019

Обратите внимание, что этот проект был создан в Xcode 10. Я недавно обновился до Xcode 11. Это произошло.

У меня есть UINavigationController, который выдвигает представлениеКонтроллеры.Начальный вид контроллера выглядит нормально.Но когда я переключаюсь на другой контроллер представления, нажимая его, второй контроллер представления перекрывает строку состояния.Это произошло только в iOS 13. Я тестировал на симуляторе.Использование Xcode 11.

Видимость панели навигации скрыта.

Установка презентации в полноэкранный или текущий контекст имеет тот же результат.Кажется, что он выходит за пределы безопасной зоны, но я установил его ниже безопасной зоны.

Я перешел с помощью:

self.navigationController?.performSegue(withIdentifier: "myAlertsSegue", sender: self)

Этот проект был создан в Xcode 10. Я столкнулся с этимпроблема после обновления до Xcode 11. Если я создаю новый проект в Xcode 11, кажется, нет никаких проблем.Я предполагаю, у меня проблема с миграцией.

Вот несколько снимков экрана:

Контроллер начального вида:

Initial View Controller

View Controller 2:

View Controller 2

Настройка раскадровки:

Xcode 11 storyboard

Инспектор атрибутов Segue:

Segue Attributes Inspector

Инспектор атрибутов контроллера просмотра 2

View Controller 2 Attributes Inspector

Обновление Обходной путь, который я сделал, заключался в том, чтобы встроить каждый контроллер вида в контроллер навигации.Это решило проблему, но переход не является гладким, потому что я не могу выдвинуть контроллеры навигации.Я должен был представить их.Я не знаю, почему это происходит на iOS 13.

Обновление Я нашел ответ сам.Посмотрите ниже, поможет ли это вам.

1 Ответ

0 голосов
/ 30 сентября 2019

Я нашел ответ на свой вопрос.Я попытался создать новый проект в Xcode 11, чтобы увидеть разницу по сравнению с проектом, созданным в Xcode 10. Различия связаны с UISceneSession, который доступен только в iOS 13. Надеюсь, этот ответ поможет всем тем, кто испытывает ту же проблему, что иЯ делаю.

Вот различия:

  • UISceneSession Lifecycle в AppDelegate.swift Существуют методы для UISceneSession.Добавьте эти строки в AppDelegate.swift.
// MARK: UISceneSession Lifecycle

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
  • SceneDelegate.swift

Это новый создаваемый класс.

import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    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).
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }


}
  • И, наконец, добавьте это в Info.plist
<key>UIApplicationSceneManifest</key>
    <dict>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneClassName</key>
                    <string></string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                    <key>UISceneConfigurationName</key>
                    <string>Default Configuration</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Main</string>
                </dict>
            </array>
        </dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
    </dict>

Также обратите внимание, что при переходе на другой раскадровку вам может потребоваться установить modalPresentationStyle = .fullScreen.

Очистить и построить.Надеюсь это поможет.Upvote, если это сработало для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...