Как я могу отклонить progressView, когда он полностью загружен? - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть прогресс, который отслеживает состояние загрузки видео с YouTube через WKWebView. Когда он загружен, я хочу отклонить progressView, потому что, когда я возвращаюсь на главную страницу моего приложения, строка состояния все еще там (но она ничего не отображает и занимает место, блокируя другие элементы моего приложения). Как мне, когда progressView полностью загружен, отклонить progressView?

Это мой класс, который имеет дело с WKWebView.

import UIKit
import WebKit

class VideoPlayViewController: UIViewController, WKNavigationDelegate {

    var webView: WKWebView!
    var progressView: UIProgressView!
    var videoURL: String = ""


    override func loadView() {
        webView = WKWebView()
        webView.navigationDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: videoURL)!
        webView.load(URLRequest(url: url))
        webView.allowsBackForwardNavigationGestures = true

        //Progress View/ Refresh Button
        progressView = UIProgressView(progressViewStyle: .default)
        progressView.sizeToFit()
        let progressButton = UIBarButtonItem(customView: progressView)
        progressView.progressTintColor = UIColor(red: 254, green: 53, blue: 98)

        let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let refresh = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(webView.reload))
         refresh.tintColor = UIColor(red: 254, green: 53, blue: 98)

        toolbarItems = [progressButton, spacer, refresh]
        navigationController?.isToolbarHidden = false

        // Lets the progress bar change according to what the Observer sends back (# from 0-1)
        webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)


    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "estimatedProgress" {
            progressView.progress = Float(webView.estimatedProgress)
        }
    }
}

Если вам нужно больше информации / больше кода, дайте мне знать.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Проверка webView (_: didFinish:) метод WKNavigationDelegate

0 голосов
/ 29 апреля 2018

Вы должны установить тип:

public typealias isCompletion = (_ isCompleted: Bool?) -> Void

И добавьте такие переменные в класс:

var completion: isCompletion?

Теперь вам нужно создать метод:

func webViewLoad(_ iscompleted:@escaping isCompletion){
    completion = iscompleted
    let url = URL(string: videoURL)!
    webView.load(URLRequest(url: url))
    webView.allowsBackForwardNavigationGestures = true
}

Вы должны установить завершение в методе делегата

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    print("finish to load")
    completion(true)
}

Вы можете вызвать этот метод из viewdidload так:

    // show loading from here
    webViewLoad { (flag) in

    //hide loading here

    }
0 голосов
/ 29 апреля 2018
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    guard let keyPath = keyPath else { return }

    switch keyPath {  
    case "estimatedProgress":
        // If you are using a `UIProgressView`, this is how you update the progress
        progressView.isHidden = webView.estimatedProgress == 1
        progressView.progress = Float(webView.estimatedProgress)

    default:
        break
    }
}

и не забывайте деинициализировать наблюдателей

 deinit {
    //remove all observers
    webView.removeObserver(self, forKeyPath: "estimatedProgress")
} 
...