En iOS 9, ¿por qué se está presionando SFSafariViewController en lugar de presentarse de manera modal?
iphone uiviewcontroller (4)
Acabo de tener el mismo problema. Además, el botón hecho funciona incluso si no configura el delegado. No estoy seguro de por qué sucede. Sin embargo, encontré una solución alternativa: envolver el controlador de safari en un controlador de navegación y ocultar la barra de navegación.
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)
}
}
Estoy presentando un SFSafariViewController
llamando a presentViewController:animated:completion:
en una instancia de UIViewController
.
El resultado es que se presiona (se desliza desde la derecha), como si pushViewController:animated:
llamado pushViewController:animated:
en una instancia de UINavigationController
. He verificado que todo esto está sucediendo en la cola principal. Y el controlador de la vista de presentación no es un modal en sí mismo (lo que no debería importar de todos modos, pero por si acaso, podemos descartarlo).
Si sustituyo el SFSafariViewController
con un UIViewController
, funciona como se esperaba, se presenta de manera modesta.
weakSelf.oAuthViewController = [[SFSafariViewController alloc] initWithURL:url];
[viewController presentViewController:weakSelf.oAuthViewController animated:YES completion:nil];
¿Alguna idea de por qué o cómo evitar esto?
Aquí hay una manera simple de obtener una presentación modal vertical:
let safari = SFSafariViewController(URL: url)
safari.modalPresentationStyle = .OverFullScreen
presentViewController(safari, animated: true, completion: nil)
La versión Objective-C de iGerms responde:
-(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];
}
Para usar el estilo de transición modal predeterminado, simplemente puede establecer el delegado de transición igual a uno mismo.
let svc = SFSafariViewController(url: url)
svc.transitioningDelegate = self //use default modal presentation instead of push
present(svc, animated: true, completion: nil)
Deberá adoptar el protocolo UIViewControllerTransitioningDelegate
en su controlador de vista, pero no hay funciones necesarias para implementar.
Esto se mencionó en la Sesión 225 en WWDC, Novedades en Safari View Controller .