2016-02-25 26 views
20

Sto presentando un SFSafariViewController chiamando presentViewController:animated:completion: su un'istanza UIViewController.In iOS 9, perché SFSafariViewController viene inserito anziché presentato in modo modale?

Il risultato è che si ottiene spinta su (scorre dalla destra), come se chiamato pushViewController:animated: su un'istanza UINavigationController. Ho verificato che tutto sta accadendo nella coda principale. E il controller di presentazione che presenta non è una modal stessa (che non dovrebbe comunque importare, ma nel caso, possiamo escluderlo).

Se sostituisco il SFSafariViewController con un UIViewController, funziona come previsto, presenta modalmente.

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

Qualche idea sul perché o su come aggirare questo problema?

risposta

22

Ecco un modo semplice per ottenere una presentazione modale verticale:

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

Mentre funziona meglio durante la navigazione, questo non è modale. –

20

Ho appena avuto lo stesso problema. Inoltre, il pulsante Fine funziona anche se non si imposta il delegato. Non so perché succede. Tuttavia, ho trovato una soluzione: avvolgere il controller safari in un controller di navigazione e nascondere la barra di navigazione.

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) 
    } 
} 
5

versione Objective-C di iGerms rispondere:

-(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]; 
} 
2

Per usare lo stile di transizione predefinita modale, è possibile imposta semplicemente il delegato in transizione uguale a se stesso.

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

Avrai bisogno di adottare il protocollo UIViewControllerTransitioningDelegate nel vostro controller di vista, ma non ci sono le funzioni necessarie per l'attuazione.

Questo è stato menzionato in Session 225 at WWDC, What's New in Safari View Controller.