Загрузка анимации зависла / зависла при загрузке веб-просмотра - PullRequest
0 голосов
/ 27 февраля 2019

Я загружаю анимацию загрузки прогресса, и когда приходит ответ от Alamofire, я использую часть ответа для создания полного URL-адреса, который мне нужно загрузить в wkwebview, а затем запускаю webview.load (..).

Моя проблема в том, что анимация загрузки прогресса застревает, как только начинает происходить webview.load (..), и остается застрявшей, пока я ее не скрываю ().

Как мне на самом деле заставить мою анимацию двигаться, пока веб-просмотр начинает загружать страницу?

MyViewController.swift

class MyViewController: UIViewController, WKScriptMessageHandler {

    var webView: WKWebView?

    @IBOutlet weak var webViewContainer: UIView!

    var webConfig:WKWebViewConfiguration {
        get {
            let webCfg:WKWebViewConfiguration = WKWebViewConfiguration()

            let userController:WKUserContentController = WKUserContentController()
            userController.add(self, name: "mycontroller")

            webCfg.userContentController = userController;

            return webCfg;
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView = WKWebView (frame: webViewContainer.bounds, configuration: webConfig)
        webView!.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        webView?.scrollView.isScrollEnabled = false
        webViewContainer.addSubview(webView!)

        loadWebview()
    }

    func loadWebview(){
        Loading.shared.show(self.view)

        Alamofire.request(MYAPI, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
            .responseJSON { response in
                let url = URL(string: "https://path-to-load/\(response.key)")
                    self.webView!.load(URLRequest(url: url!))
        }

    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        let message = message.body as! [String:AnyObject]
        let event = message["event"] as? String ?? "empty"

        switch (event){
        case "loading-finished":
            DispatchQueue.main.async {
                Loading.shared.hide(animated: true)
            }
            break
        default:
            break
        }
    }


}

Loading.swift

public class Loading {
        var blurredEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        let imageView = UIImageView(image: UIImage(named: "loading_image"))

        class var shared: Loading {
            struct LoadingStatic {
                static let instance: Loading = Loading()
            }
            return LoadingStatic.instance
        }

        init() {
            imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
            imageView.contentMode = .scaleToFill
            blurredEffectView.contentView.addSubview(imageView)
        }

        public func show(_ view: UIView, inView: Bool = false) {
            var window: UIView!
            if inView == false, let w = view.window {
                window = w
            } else {
                window = view
            }

            if blurredEffectView.superview == window {
                return
            }

            let rotation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
            rotation.toValue = NSNumber(value: Double.pi * 2)
            rotation.duration = 1
            rotation.isCumulative = true
            rotation.repeatCount = Float.greatestFiniteMagnitude
            imageView.layer.add(rotation, forKey: "rotationAnimation")

            imageView.center = window.center
            blurredEffectView.frame = window.bounds
            window.addSubview(blurredEffectView)

            blurredEffectView.fadeIn()
        }
    }

1 Ответ

0 голосов
/ 28 февраля 2019

Возможные решения:

1) Выполните загрузку в окне приложения, когда требуется полноэкранная загрузка (inview == false по умолчанию), и сохраните loadWebview () в viewDidLoad

public func show(_ view: UIView? = nil, inView: Bool = false) {
        var window: UIView!
        if inView == false, let w = UIApplication.shared.delegate?.window {
            window = w
        } else {
            window = view
        }
     ...

2) Переместить loadWebview () из viewDidLoad в viewDidAppear

Важная часть, которая здесь перемещается, - Loading.shared.show(self.view).Я не смог анимировать компоненты моего представления, пока оно не закончило планировку (что в точности происходит в viewDidAppear ()).

Подробнее: viewDidLoad isвызывается после инициализации MyViewController и инициализации основного представления, но до представления представления в пользовательском интерфейсе.Это означает, что viewDidLoad позволяет мне настроить ViewController и View до того, как он будет показан пользователю для взаимодействия.

Хотя это было хорошее и быстрое решение, в некоторых ситуациях это может не работать какожидается, что viewDidAppear может быть вызван дважды, и, следовательно, дважды отображает загрузочное представление, что приведет к странному ux.

...