Предполагаемый прогресс WKWebView

Я пытаюсь реализовать Estimated Progress в моем WKWebView но, похоже, не WKWebView его. Вы можете помочь?

Вот что у меня есть:

 self.view = self.webView; NSURL *url = [NSURL URLWithString:stringWeb]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration]; [self.webView loadRequest:request]; 

Я вижу, что этот ответ немного доходит до него, но это для счетчика: UIWebView с индикатором прогресса

И Apple документирует какой-то estimatedProgress (я предполагаю, что его тонкая синяя полоса находится прямо под панелью навигации, которая показывает прогресс, как в Safari), но я вообще не вижу, как это будет реализовано: https://developer.apple. ком / библиотека / ИОС / документация / WebKit / Справка / WKWebView_Ref / # // apple_ref / ОКК / instp / WKWebView / estimatedProgress

Поэтому я застрял здесь. Любая помощь будет оценена, спасибо!

ОБНОВЛЕНИЕ : Это то, что я имею прямо сейчас. Получение сбоя, потому что похоже, что мой Progress View и WKWebView загружаются дважды, и я не уверен, почему это было бы. Получение ошибки, которую наблюдатель должен удалить. Вот мой код в его нынешнем виде –

ViewController.h

 @interface WebPageViewController : UIViewController <UIWebViewDelegate> @property (strong, nonatomic) NSString *stringMobile; @property (strong, nonatomic) NSString *stringWeb; @property (strong, nonatomic) IBOutlet UIView *view; @property (nonatomic, strong) WKWebView *webView; @property (nonatomic) UIProgressView *progressView; 

ViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:self.webView]; [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL]; self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; self.progressView.center = self.view.center; [self.view addSubview:self.progressView]; NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:stringWeb]]; [self.webView loadRequest:URLRequest]; } - (void)dealloc { [self.webView removeObserver:self forKeyPath:@"estimatedProgress"]; // if you have set either WKWebView delegate also set these to nil here [self.webView setNavigationDelegate:nil]; [self.webView setUIDelegate:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"estimatedProgress"] && object == self.webView) { [self.progressView setAlpha:1.0f]; [self.progressView setProgress:self.webView.estimatedProgress animated:YES]; if(self.webView.estimatedProgress >= 1.0f) { [UIView animateWithDuration:0.3 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{ [self.progressView setAlpha:0.0f]; } completion:^(BOOL finished) { [self.progressView setProgress:0.0f animated:NO]; }]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } 

UPDATE: использование CocoaPods – это то, что у меня есть, но показывая два представления вместо одного веб-представления

 - (void)viewDidLoad { [super viewDidLoad]; NSURL *myURL = [NSURL URLWithString: [self.url stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:myURL]; //[self.webView loadRequest:request]; // KIN // Deleted UIWebView in Storyboard KINWebBrowserViewController *webBrowser = [[KINWebBrowserViewController alloc] init]; [self.navigationController pushViewController:webBrowser animated:YES]; [webBrowser loadURL:myURL]; } 

2 Solutions collect form web for “Предполагаемый прогресс WKWebView”

Проверьте KINWebBrowser на GitHub, чтобы увидеть полную реализацию решения ниже.

Если вы внимательно посмотрите на документацию для свойства WKWebView которым вы WKWebView , вы увидите:

 The WKWebView class is key-value observing (KVO) compliant for this property. 

Это означает, что вы можете настроить наблюдение за ключевыми значениями на свойстве valuProgress, чтобы наблюдать изменения его значения. Из метода observeValueForKeyPath вы можете обновить свой интерфейс.

Дизайн KVO в какао довольно грязный. Ознакомьтесь с этой замечательной статьей NSHipster о лучших практиках Key Value Observing .

Вот реализация WKWebView для estimatedProgress WKWebView на WKWebView :

С вашего UIViewController настройте свой WKWebView и добавьте себя в качестве наблюдателя estimatedProgress WKWebView

  self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:self.webView]; [self.webView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:NSKeyValueObservingOptionNew context:NULL]; 

В том же UIViewController настройте свой метод observeValueForKeyPath чтобы отфильтровать свойство webView . Затем вы можете напрямую получить доступ к значению estimatedProgress прогноза и соответствующим образом обновить свой интерфейс.

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.webView) { NSLog(@"%f", self.webView.estimatedProgress); // estimatedProgress is a value from 0.0 to 1.0 // Update your UI here accordingly } else { // Make sure to call the superclass's implementation in the else block in case it is also implementing KVO [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } 

Обязательно удалите UIViewController из UIViewController в методе dealloc этого UIViewController. Важно проверить, isViewLoaded чтобы избежать сбоя, если наблюдатель еще не был добавлен.

 - (void)dealloc { if ([self isViewLoaded]) { [self.wkWebView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))]; } // if you have set either WKWebView delegate also set these to nil here [self.wkWebView setNavigationDelegate:nil]; [self.wkWebView setUIDelegate:nil]; } 

Чтобы увидеть это в действии на некоторых больших файлах, загрузите огромный файл изображения этой сладкой галактики. (Этот файл составляет 35 МБ. Убедитесь, что вы на WiFi!)

  NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.spacetelescope.org/static/archives/images/large/opo0328a.jpg"]]; [self.webView loadRequest:URLRequest]; 

Если вы используете UIProgressView вы можете добиться такого сафари, как эффект постепенного исчезновения с помощью этого кода:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.wkWebView) { [self.progressView setAlpha:1.0f]; [self.progressView setProgress:self.wkWebView.estimatedProgress animated:YES]; if(self.wkWebView.estimatedProgress >= 1.0f) { [UIView animateWithDuration:0.3 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{ [self.progressView setAlpha:0.0f]; } completion:^(BOOL finished) { [self.progressView setProgress:0.0f animated:NO]; }]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } 

Swift, как:

 @IBOutlet weak var progressView: UIProgressView! //... func viewDidLoad() { webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil) // add observer for key path } // ... override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if (keyPath == "estimatedProgress") { // listen to changes and updated view progressView.hidden = webView.estimatedProgress == 1 progressView.setProgress(Float(webView.estimatedProgress), animated: true) } } 

Обновление Swift 3:

 // Add Observer in viewDidLoad webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil) override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if (keyPath == "estimatedProgress") { // listen to changes and updated view progress.isHidden = webView.estimatedProgress == 1 progress.setProgress(Float(webView.estimatedProgress), animated: false) } } Also please make sure to implement "WKNavigationDelegate" and add webview reference navigationDelegate to self like below webView.navigationDelegate=self 
  • Универсальные ссылки, не работающие с WKWebView
  • Cordova + Crosswalk iOS все еще использует UIWebView
  • Загружать пользовательскую ошибку htmlString, когда WKWebView loadRequest терпит неудачу
  • WKWebView предоставляет SecurityError при связывании html и javascript с приложением
  • Коды ошибок HTTP WKWebView
  • Как очистить WKBackForwardList от WKWebView?
  • Добавление заголовка в WKWebView ScrollView
  • Отображение индикатора активности на WKWebView с использованием быстрой
  • Как определить причину сбоя WKWebView
  • Странное заполнение при использовании UIWebView / WKWebView
  • Загружать файлы из локальной файловой системы на веб-сайт WKWebView из файла: // URL
  • Interesting Posts

    ios swift parse: методы с асинхронными результатами

    Загрузить IPA с помощью Application Loader

    Использование библиотеки Swift в проекте Objective-C

    Grand Central Dispatch (GCD) против performSelector – требуется лучшее объяснение

    iOS8 – Single Widget для нескольких целей

    Как я могу объединить фрагменты пути с помощью объектной-C в iOS?

    Предварительная загрузка видео для воспроизведения без задержки

    Как выровнять текст UILabel в параграфе

    Что является альтернативой pch in swift?

    Почему все IBOutlet (ы) найдены nil, когда viewdidload вызывается в App Delegate?

    Отправка аттрибутов с помощью MailCore2 на ios 8

    Как предотвратить изменение размера UIView в соответствии с высотой ScrollView (автоматическое отключение)?

    Предполагается, что объекты macOS и iOS должны иметь один и тот же файл прав?

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

    Как преобразовать UIImage в J2K (JPEG2000) в iOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.