iOS 載入webView進度條
阿新 • • 發佈:2019-01-08
現在的app常常會嵌入不少的h5頁面,這裡參照微信顯示web頁面的方式,做了一個導航欄下的載入進度條.因為專案最低支援iOS7,所以不能使用WKWebView
來載入網頁,只能使用 UIWebView
,檢視 UIWebView
的API可以發現,並沒有代理或是通知告訴我們webView載入了多少,所以這個進度條我決定用虛擬的方式來做,就是假裝知道載入了多少.
載入WebView的控制器LMWebController
LMWebController.m
// // LMWebController.m // LMWebViewLoadProgress // // Created by limin on 17/1/16. // Copyright © 2017年 君安信(北京)科技有限公司. All rights reserved. // #import "LMWebController.h" #import "LMWebProgressLayer.h" #import "UIView+Frame.h" @interface LMWebController ()<UIWebViewDelegate> @end @implementation LMWebController { UIWebView *_webView; LMWebProgressLayer *_progressLayer; ///< 網頁載入進度條 } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [self setupUI]; } - (void)setupUI { _webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; _webView.delegate = self; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.url]]; [_webView loadRequest:request]; _webView.backgroundColor = [UIColor whiteColor]; _progressLayer = [LMWebProgressLayer new]; _progressLayer.frame = CGRectMake(0, 42, SCREEN_WIDTH, 2); [self.navigationController.navigationBar.layer addSublayer:_progressLayer]; [self.view addSubview:_webView]; } #pragma mark - UIWebViewDelegate - (void)webViewDidStartLoad:(UIWebView *)webView { [_progressLayer startLoad]; } - (void)webViewDidFinishLoad:(UIWebView *)webView { [_progressLayer finishedLoad]; self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { [_progressLayer finishedLoad]; } - (void)dealloc { [_progressLayer closeTimer]; [_progressLayer removeFromSuperlayer]; _progressLayer = nil; NSLog(@"i am dealloc"); } @end
進度條:LMWebProgressLayer.h
// // LMWebProgressLayer.h // LMWebViewLoadProgress // // Created by limin on 17/1/16. // Copyright © 2017年 君安信(北京)科技有限公司. All rights reserved. // #import <QuartzCore/QuartzCore.h> #import <UIKit/UIKit.h> #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width @interface LMWebProgressLayer : CAShapeLayer - (void)finishedLoad; - (void)startLoad; - (void)closeTimer; @end
進度條:LMWebProgressLayer.m
// // LMWebProgressLayer.m // LMWebViewLoadProgress // // Created by limin on 17/1/16. // Copyright © 2017年 君安信(北京)科技有限公司. All rights reserved. // #import "LMWebProgressLayer.h" #import "NSTimer+Addition.h" static NSTimeInterval const kFastTimeInterval = 0.003; @implementation LMWebProgressLayer { CAShapeLayer *_layer; NSTimer *_timer; CGFloat _plusWidth; ///< 增加點 } - (instancetype)init { if (self = [super init]) { [self initialize]; } return self; } - (void)initialize { self.lineWidth = 2; self.strokeColor = [UIColor greenColor].CGColor; _timer = [NSTimer scheduledTimerWithTimeInterval:kFastTimeInterval target:self selector:@selector(pathChanged:) userInfo:nil repeats:YES]; [_timer pause]; UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(0, 2)]; [path addLineToPoint:CGPointMake(SCREEN_WIDTH, 2)]; self.path = path.CGPath; self.strokeEnd = 0; _plusWidth = 0.01; } - (void)pathChanged:(NSTimer *)timer { self.strokeEnd += _plusWidth; if (self.strokeEnd > 0.8) { _plusWidth = 0.002; } } - (void)startLoad { [_timer resumeWithTimeInterval:kFastTimeInterval]; } - (void)finishedLoad { [self closeTimer]; self.strokeEnd = 1.0; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.hidden = YES; [self removeFromSuperlayer]; }); } - (void)dealloc { // NSLog(@"progressView dealloc"); [self closeTimer]; } #pragma mark - private - (void)closeTimer { [_timer invalidate]; _timer = nil; } @end
定時器:NSTimer+Addition.h
//
// NSTimer+Addition.h
// LMWebViewLoadProgress
//
// Created by limin on 17/1/16.
// Copyright © 2017年 君安信(北京)科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSTimer (Addition)
- (void)pause;
- (void)resume;
- (void)resumeWithTimeInterval:(NSTimeInterval)time;
@end
定時器:NSTimer+Addition.m
//
// NSTimer+Addition.m
// LMWebViewLoadProgress
//
// Created by limin on 17/1/16.
// Copyright © 2017年 君安信(北京)科技有限公司. All rights reserved.
//
#import "NSTimer+Addition.h"
@implementation NSTimer (Addition)
- (void)pause {
if (!self.isValid) return;
[self setFireDate:[NSDate distantFuture]];
}
- (void)resume {
if (!self.isValid) return;
[self setFireDate:[NSDate date]];
}
- (void)resumeWithTimeInterval:(NSTimeInterval)time {
if (!self.isValid) return;
[self setFireDate:[NSDate dateWithTimeIntervalSinceNow:time]];
}
@end