12

この投稿ごとに SFSafariViewController を介してアプリに URL を自動的にロードさせることができました。これはうまく機能します。唯一の欠点は navbar です。

SFSafariViewController navbar は、URL が読み取り専用であり、「完了」リンクは何もせず、ページをリロードするため、この方法で使用すると役に立たなくなります。そのため、ナビゲーションバーを完全に非表示にしたいと思います。

受け入れられた回答に添付されたコメントによると、ルートビューコントローラーを SFSafariViewController に設定することが提案されましたが、これは機能しません。前述の投稿にコードが含まれている単一のビュー コントローラーがあるため、セットアップは簡単です。

ナビゲーションバーを非表示にしながら、SFSafariViewController の利点を維持するにはどうすればよいですか? または、ナビゲーション バーを非表示にできない場合は、少なくとも「完了」リンクを非表示にしますか?

コードスニペット:

import UIKit
import SafariServices

class ViewController: UIViewController
{
    private var urlString:String = "https://example.com"

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(animated: Bool)
    {

        super.viewDidAppear(animated)

        let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)

        self.presentViewController(svc, animated: true, completion: nil)

        self.navigationItem.rightBarButtonItem = nil
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

----- 動作します。Navbar は「非表示」です -----

import UIKit
import SafariServices

class ViewController: UIViewController
{
    private var urlString:String = "https://example.com"

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // This will remove the status (battery, time, etc) bar
        UIApplication.sharedApplication().statusBarHidden = true
    }

    override func viewDidAppear(animated: Bool) {

        super.viewDidAppear(animated)

        let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)

        // Kind of a hack, in that we really aren't removing the navbar
        //  Rather we are adjusting the starting point of the vpc object so it appears as the navbar is hidden
        self.presentViewController(svc, animated: true) {

            var frame = svc.view.frame
            let OffsetY: CGFloat = 42

            frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y - OffsetY)
            frame.size = CGSize(width: frame.size.width, height: frame.size.height + OffsetY)
            svc.view.frame = frame
        }
    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // For this to work be sure to set the following setting to OFF, in info.plist
    //  'View controller-based status bar appearance'
    override func prefersStatusBarHidden() -> Bool {
        return true
    }
}
4

4 に答える 4

8

このコードを入れてviewDidAppear:

let safariViewController = SFSafariViewController(URL: url)
presentViewController(safariViewController, animated: true) {
    var frame = safariViewController.view.frame
    let OffsetY: CGFloat  = 64
    frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y - OffsetY)
    frame.size = CGSize(width: frame.width, height: frame.height + OffsetY)
    safariViewController.view.frame = frame
}

ステータス バーを非表示にするには、info.plist ファイルで を設定View controller-based status bar appearanceし、これをビュー コントローラーに挿入します。YES

override func prefersStatusBarHidden() -> Bool {
    return true
}

警告: 全画面表示に SFSafariViewController を使用しないことをお勧めします。これは、再読み込みができないためです (再読み込みボタンが UINavigationBar にあるため)。リクエストが失敗した場合、アプリケーションは役に立たなくなります。代わりに、カスタムツールバーを備えたフルスクリーンの WKWebView を使用してください。

更新: リロード ボタンを非表示にしないようにするには、SFSafariViewController の完了ボタンの上にビュー/imageView を追加し、ボタンを非表示にするか、少なくともタップできないようにします。

presentViewController(svc, animated: true) {
    let width: CGFloat = 66
    let x: CGFloat = self.view.frame.width - width

    // It can be any overlay. May be your logo image here inside an imageView.
    let overlay = UIView(frame: CGRect(x: x, y: 20, width: width, height: 44))
    overlay.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
    svc.view.addSubview(overlay)
}

このアプローチの問題点は、オーバーレイが画面に表示されたままになることだけですが、適切な画像が見つかれば問題ありません。

于 2015-11-19T20:51:33.937 に答える
2
import Foundation
import UIKit
import SafariServices

class MySafariFullScreenViewController: UIViewController  {

    override func viewDidLoad() {
        super.viewDidLoad()
        //WONT WORK read only you need to override it in this VC or in SFSafVC using extension - see bottom of this code
        //self.prefersStatusBarHidden = true

    }

    override func viewDidAppear(_ animated: Bool){
        let urlString = "https://......"
        //if a log screen - i think SFSafariViewController can handle this
        //let urlString = "https://<domain>login?redirect=https:<homescreen>"


        if let url: URL = URL(string: urlString) {
            let safariViewController = SFSafariViewController(url: url)
            present(safariViewController, animated: true) {

                var frame = safariViewController.view.frame
                //if status bar not hidden
                l//et OffsetY: CGFloat  = 64
                //if status bar hidden
                let OffsetY: CGFloat  = 44

                frame.origin = CGPoint(x: frame.origin.x, y: frame.origin.y - OffsetY)
                frame.size = CGSize(width: frame.width, height: frame.height + OffsetY)
                safariViewController.view.frame = frame


            }
        }else{
            //url error
        }



    }
    //this is for this vc - but for SFSafariVC you need override using extension
    override var prefersStatusBarHidden: Bool{
        get{
            return true
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

extension SFSafariViewController{
     override open var prefersStatusBarHidden: Bool{
        get{
            return true
        }
    }
}
于 2017-07-11T17:57:35.270 に答える