20

2 strange things happen when I try to push Safari ViewController:

  1. Its adress bar with Done button is placed below my Navigation Bar;

  2. Delegate method safariViewControllerDidFinish: does not get called when I press back button.

I don't think Apple would approve of this behavoir, so:

Is there a way to push Safari ViewController without these problems?

Yaroslav
  • 2,435
  • 1
  • 19
  • 36
  • 3
    It is not stated in the documenting, but you can only present the view modally. You should not push in a navigation controller. – rckoenes Sep 16 '15 at 09:26

2 Answers2

58

Do not push a SFSafariViewController with the pushViewController:animated: method, instead, use the presentViewController:animated:completion: method.

The Safari view controller will be presented with a standard push animation.

0xced
  • 25,219
  • 10
  • 103
  • 255
7

In addition to rckoenes comment the only other option i see is to hide the navigation bar when presenting an SFSafariViewController

import UIKit
import SafariServices

class ViewController: UIViewController {
    @IBAction func openBrowser(sender: AnyObject) {
        let safariViewController = SFSafariViewController(URL: NSURL(string: "http://your.url")!)
        safariViewController.delegate = self

        // hide navigation bar and present safari view controller
        navigationController?.navigationBarHidden = true
        navigationController?.pushViewController(safariViewController, animated: true)
    }
}

extension ViewController: SFSafariViewControllerDelegate {
    func safariViewControllerDidFinish(controller: SFSafariViewController) {
        // pop safari view controller and display navigation bar again
        navigationController?.popViewControllerAnimated(true)
        navigationController?.navigationBarHidden = false
    }
}
warly
  • 1,458
  • 1
  • 16
  • 21
  • The push seems to work fine, but the SFSafariViewController is dismissing the presented view controller, any way to avoid it? – Alvaro Rivoir Jun 11 '18 at 12:54