user1485367
user1485367

Reputation:

How to push SFSafariViewController?

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?

Upvotes: 20

Views: 10535

Answers (2)

0xced
0xced

Reputation: 26583

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.

Upvotes: 58

warly
warly

Reputation: 1630

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

Upvotes: 7

Related Questions