Ответ 1
Вот простой способ получить вертикальное модальное представление:
let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .OverFullScreen
presentViewController(safari, animated: true, completion: nil)
Я представляю SFSafariViewController
, вызывая presentViewController:animated:completion:
в экземпляре UIViewController
.
В результате он нажимается (слайды справа), как если бы я вызывал pushViewController:animated:
на экземпляр UINavigationController
. Я проверил, что все это происходит в главной очереди. А представляющий контроллер представлений не является самим модалом (что не имеет значения, так или иначе, но на всякий случай мы можем это исключить).
Если я подстановлю SFSafariViewController
на UIViewController
, он работает так, как ожидалось, он представляет собой модально.
weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];
Любая идея, почему и как обойти это?
Вот простой способ получить вертикальное модальное представление:
let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .OverFullScreen
presentViewController(safari, animated: true, completion: nil)
У меня была такая же проблема. Кроме того, кнопка "Готово" работает, даже если вы не настроили делегата. Не знаю, почему это происходит. Тем не менее, я нашел обходное решение: обертывание контроллера 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)
}
}
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];
}
Чтобы использовать стиль модального перехода по умолчанию, вы можете просто установить переходный делегат равным себе.
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.