Подтвердить что ты не робот

В iOS 9, почему SFSafariViewController толкается вместо представленного модально?

Я представляю SFSafariViewController, вызывая presentViewController:animated:completion: в экземпляре UIViewController.

В результате он нажимается (слайды справа), как если бы я вызывал pushViewController:animated: на экземпляр UINavigationController. Я проверил, что все это происходит в главной очереди. А представляющий контроллер представлений не является самим модалом (что не имеет значения, так или иначе, но на всякий случай мы можем это исключить).

Если я подстановлю SFSafariViewController на UIViewController, он работает так, как ожидалось, он представляет собой модально.

weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];

Любая идея, почему и как обойти это?

4b9b3361

Ответ 1

Вот простой способ получить вертикальное модальное представление:

let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .OverFullScreen
presentViewController(safari, animated: true, completion: nil)

Ответ 2

У меня была такая же проблема. Кроме того, кнопка "Готово" работает, даже если вы не настроили делегата. Не знаю, почему это происходит. Тем не менее, я нашел обходное решение: обертывание контроллера Safari в навигационном контроллере и скрытие панели навигации.

func openURL(url:NSURL) {

    if #available(iOS 9.0, *) {
        let safariController = SFSafariViewController(url: url)
        safariController.delegate = self
        let navigationController = UINavigationController(rootViewController: safariController)
        navigationController.setNavigationBarHidden(true, animated: false)
        self.present(navigationController, animated: true, completion: nil)
    } else {
        UIApplication.sharedApplication().openURL(url)
    }
}

Ответ 3

Objective-C версия ответа iGerms:

-(void)openURL:(NSURL *)url {
   SFSafariViewController *safariController = [[SFSafariViewController alloc]initWithURL:url];
   safariController.delegate = self;
   UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:safariController];
   [navigationController setNavigationBarHidden:YES animated:NO];
   [self presentViewController:navigationController animated:YES completion:nil];
}

Ответ 4

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

let svc = SFSafariViewController(url: url)
svc.transitioningDelegate = self //use default modal presentation instead of push
present(svc, animated: true, completion: nil)

Вам нужно будет принять протокол UIViewControllerTransitioningDelegate в вашем контроллере представления, но для реализации нет необходимых функций.

Об этом говорилось в Сессия 225 на WWDC, что нового в Safari View Controller.