Загрузка экрана смещена от центра в зависимости от раскадровки запуска? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть 2 раскадровки: Onboarding и Main. Все отлично работает, насколько выполнение идет. Проблема в том, что у меня в начале экрана Main.storyboard отображается экран загрузки, который выглядит по-разному в зависимости от запуска раскадровки.

Сценарий 1. Новый пользователь запускает приложение, проходит через Onboarding.storyboard, затем запускается Main.storyboard и экран загрузки выглядит следующим образом: Правильный экран

Сценарий 2: пользователь запускает приложение во второй раз, поэтому Onboarding.storyboard не запускается: экран загрузки смещен от центра как это: Неправильный экран

Короче говоря: если нет Onboarding.storyboard, он выглядит неправильно. Проблема отображается только на iPad. портрет выглядит нормально.

Весь мой код экрана загрузки находится внутри моего первого контроллера представления Main.Storyboard, поэтому я предполагаю, что проблема заключается в порядке, в котором этот код вызывается?

Onboarding.Storyboard имеет только 1 контроллер вида Main.Storyboard: TabBarController -> NavController -> FirstV C

Я поместил ниже свой код SceneDelegate вместе с кодом экрана загрузки FirstV C.

Если вы хотите углубиться, я использую RevealingSplashView, доступный на github. Поскольку я не думаю, что это проблема, я не стал вдаваться в подробности.

SceneDelegate:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let windowScene = (scene as? UIWindowScene) else { return }

    window = UIWindow(frame: windowScene.coordinateSpace.bounds)
    window?.windowScene = windowScene

    let onboardingStoryboard = UIStoryboard(name: "Onboarding", bundle: nil)
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var vc: UIViewController

    if UserDefaults.standard.value(forKey: "firstTimer") == nil {
        vc = onboardingStoryboard.instantiateInitialViewController()!
    } else {
        vc = mainStoryboard.instantiateInitialViewController()!
    }

    self.window?.rootViewController = vc
    self.window?.makeKeyAndVisible()
}

FirstV C соответствующий код:

class firstVC: UIViewController {

    var revealingSplashView : RevealingSplashView!

override func viewDidLoad() {
    super.viewDidLoad()

    showLoadingScreen()
}

func showLoadingScreen() {

       revealingSplashView = RevealingSplashView(iconImage: UIImage(named: "Icon")!, iconInitialSize: CGSize(width: 150, height: 150), backgroundImage: UIImage(named: "loadBackground")!)
       revealingSplashView.animationType = .heartBeat
       revealingSplashView.startAnimation()

       view.addSubview(revealingSplashView)
}

Ответы [ 2 ]

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

Дальнейшее тестирование показало, что если я верну SceneDelegate в его состояние «по умолчанию», запустив Main.storyboard, у меня не возникнет проблем.

Чтобы устранить проблему, я просто изменил свой SceneDelegate на:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let windowScene = (scene as? UIWindowScene) else { return }

    if UserDefaults.standard.value(forKey: "firstTimer") == nil {

        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene

        let onboardingStoryboard = UIStoryboard(name: "Onboarding", bundle: nil)
        var vc: UIViewController

        vc = onboardingStoryboard.instantiateInitialViewController()!

        self.window?.rootViewController = vc
        self.window?.makeKeyAndVisible()
    }

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

Убедитесь, что ограничения макета одинаковы в обеих ваших раскадровках. Я бы рекомендовал просто установить их по центру по горизонтали и по центру по вертикали на обоих.

При обратном вызове делегата вашей сцены, почему вы вызываете instantiateInitialViewController () дважды для раскадровки?

В моем * Проект 1008 * 12, я использовал раскадровки для начала. В делегате приложения didFinishLaunching я бы переопределил и установил окно, если и только если это был новый пользователь. Так что моя «Основная» раскадровка пинала большую часть времени.

Здесь можно применить ту же технику. Проверьте значения Info.plist, которые необходимо установить для работы раскадровки UIScene. Вы можете переопределить окно, если хотите показать первый раз при входе в систему, в противном случае позвольте системе создать вашу основную раскадровку.

...