2016-02-25 28 views
20

Przedstawiam SFSafariViewController, dzwoniąc pod numer presentViewController:animated:completion: w instancji UIViewController.W iOS 9, dlaczego zamiast SFSafariViewController jest prezentowany modalnie?

Rezultatem jest to, że robi się pchnął na (slajdy z prawej strony), a jeśli zadzwoniłem pushViewController:animated: na przykład UINavigationController. Sprawdziłem, że wszystko dzieje się w głównej kolejce. A prezentujący kontroler widoku nie jest samym modalem (co nie powinno mieć znaczenia, ale na wszelki wypadek możemy to wyłączyć).

Jeśli podstawię SFSafariViewController z UIViewController, działa zgodnie z oczekiwaniami, prezentuje się modalnie.

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

Każdy pomysł, dlaczego i jak to obejść?

Odpowiedz

22

Oto prosty sposób na uzyskanie pionowego modalne Prezentacja

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

Chociaż działa lepiej podczas nawigacji z powrotem, nie jest to modalne. –

20

Po prostu miałem ten sam problem. Również przycisk done działa, nawet jeśli nie skonfigurowałeś delegata. Nie wiem, dlaczego tak się dzieje. Jednak znalazłem obejście: owijanie kontrolera safari w kontroler nawigacyjny i ukrywanie paska nawigacyjnego.

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

wersja Objective-C iGerms odpowiedzieć:

-(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

Aby korzystać styl przejścia domyślne modalnego można po prostu ustaw delegata przenoszenia równego self.

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

Musisz przyjąć protokół UIViewControllerTransitioningDelegate w kontrolerze widoku, ale nie ma wymaganych funkcji do wykonania. To jest wymienione w Session 225 at WWDC, What's New in Safari View Controller.