WKWebView Geschätzter Fortschritt
Ich bin versucht zu implementieren Estimated Progress
in meinem WKWebView
aber kann nicht scheinen, um es herauszufinden. Können Sie mir helfen?
Hier ist was ich habe:
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];
Sehe ich diese Antwort bekommt es ein bisschen, aber das ist für ein spinner: UIWebView mit Fortschrittsbalken
- Und Apple-Dokumente, die irgendeine Art von estimatedProgress
(ich gehe davon aus, dass Ihr die dünne Blaue Balken rechts unten die Navigationsleiste, die zeigt, dass Fortschritte wie in Safari), aber ich sehe nicht, in der Regel, wie das umgesetzt würde: https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/#//apple_ref/occ/instp/WKWebView/estimatedProgress
So, ich bin hier hängengeblieben. Jede Hilfe würde geschätzt, danke!
UPDATE: Dies ist, was ich jetzt haben. Immer ein Absturz, weil es sieht aus wie mein Fortschritt Anzeigen und WKWebView sind, laden Sie zweimal, und ich bin nicht sicher, warum das wäre. Die Fehlermeldung erhalten, dass der Beobachter, der entfernt werden muss. Hier mein code, wie es steht-
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: Mit dem CocoaPods dies ist, was ich habe, aber zeigt seine zwei Ansichten, anstatt nur einer webview
- (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];
}
InformationsquelleAutor der Frage Realinstomp | 2014-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen KINWebBrowser auf GitHub zu sehen, eine vollständige Umsetzung der Lösung unten.
Wenn Sie genau hinsehen, um die Dokumentation für die
estimatedProgress
Eigenschaft vonWKWebView
dass Sie im Zusammenhang mit Sie werden sehen:Dies bedeutet, dass Sie einstellen können, key-value observing auf die
estimatedProgress
- Eigenschaft, um den Wandel zu beobachten, ist es Wert. Aus derobserveValueForKeyPath
Methode können Sie aktualisieren Sie Ihre UI.Den KVO-Entwurfsmuster in Cocoa ist ziemlich chaotisch. Überprüfen Sie heraus dieses hervorragende NSHipster Artikel über die besten Praktiken der Key-Value-Observing.
Hier ist der KVO-Umsetzung für
estimatedProgress
aufWKWebView
:Von Ihrem
UIViewController
richten Sie IhreWKWebView
und fügen Sie selbst als BeobachterestimatedProgress
In der gleichen
UIViewController
richten Sie IhreobserveValueForKeyPath
Methode heraus zu filtern, dieestimatedProgress
Eigenschaft vonwebView
. Sie können dann auf dieestimatedProgress
Wert direkt und aktualisieren Sie Ihre Benutzeroberfläche entsprechend.Stellen Sie sicher, entfernen Sie KVO aus der
UIViewController
in der dealloc-Methode der UIViewController. Es ist wichtig zu prüfen, obisViewLoaded
zu vermeiden, ein Absturz, wenn der Betrachter nicht bereits Hinzugefügt wurde.Um dies in Aktion zu sehen, die auf einige große Dateien laden, ein riesiges Bild-Datei von diesem süßen galaxy. (Diese Datei ist 35 MB. Stellen Sie sicher, dass Sie auf WiFi!)
Wenn Sie eine
UIProgressView
Sie erreichen können, eine safari wie fade-out-Effekt mit diesem code:InformationsquelleAutor der Antwort dfmuir
Swift-wie:
Swift 3-update:
InformationsquelleAutor der Antwort Array
Swift 3.2 und höher:
InformationsquelleAutor der Antwort Vitalii