1 NSTimer+addition.h
#import @interface NSTimer (addition)
/** 暂停时间 */
- (void)w_pauseTime;
/** 获取内容所在当前时间 */
- (void)w_webPageTime;
/** 当前时间 time 秒后的时间 */
- (void)w_webPageTimeWithTimeInterval:(NSTimeInterval)time;
@end
NSTimer+addition.m
#import "NSTimer+addition.h"
@implementation NSTimer (addition)
- (void)w_pauseTime{
//判断定时器是否有效
if (!self.isValid) {
return;
}
//停止计时器
[self setFireDate:[NSDate distantFuture]];
}
- (void)w_webPageTime{
//判断定时器是否有效
if (!self.isValid) {
return;
}
//返回当期时间
[self setFireDate:[NSDate date]];
}
- (void)w_webPageTimeWithTimeInterval:(NSTimeInterval)time{
//判断定时器是否有效
if (!self.isValid) {
return;
}
[self setFireDate:[NSDate dateWithTimeIntervalSinceNow:time]];
}
@end
2 WWebProgressLayer.h
#import
@interface WWebProgressLayer : CAShapeLayer
/** 开始加载 */
- (void)w_startLoad;
/** 完成加载 */
- (void)w_finishedLoadWithError:(NSError *)error;
/** 关闭时间 */
- (void)w_closeTimer;
- (void)w_WebViewPathChanged:(CGFloat)estimatedProgress;
@end
WWebProgressLayer.m
#import "WWebProgressLayer.h"
#import
#import "NSTimer+addition.h"
static NSTimeInterval const ProgressTimeInterval = 0.03;
@interface WWebProgressLayer()
@property (nonatomic, strong) CAShapeLayer *layer;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, assign) CGFloat plusWidth;
@end
@implementation WWebProgressLayer
- (instancetype)init {
self = [super init];
if (self) {
[self initBezierPath];
}
return self;
}
- (void)initBezierPath {
//绘制贝塞尔曲线
UIBezierPath *path = [UIBezierPath bezierPath];
//起点
[path moveToPoint:CGPointMake(0 , 3)];
//终点
[path addLineToPoint:CGPointMake(APP_WIDTH , 3)];
self.path = path.CGPath;
self.strokeEnd = 0;
_plusWidth = 0.005;
self.lineWidth = 2;
self.strokeColor = [UIColor redColor].CGColor;
_timer = [NSTimer scheduledTimerWithTimeInterval:ProgressTimeIntervaltarget:self selector:@selector(pathChanged:) userInfo:nil repeats:YES];
[_timer w_pauseTime];
}
// 设置进度条增加的进度
- (void)pathChanged:(NSTimer *)timer{
self.strokeEnd += _plusWidth;
if (self.strokeEnd > 0.60) {
_plusWidth = 0.002;
}
if (self.strokeEnd > 0.85) {
_plusWidth = 0.0007;
}
if (self.strokeEnd > 0.93) {
_plusWidth = 0;
}
}
//在KVO 计算 实际的读取进度时,调用改方法
- (void)w_WebViewPathChanged:(CGFloat)estimatedProgress {
self.strokeEnd = estimatedProgress;
}
- (void)w_startLoad {
[_timer w_webPageTimeWithTimeInterval:ProgressTimeInterval];
}
- (void)w_finishedLoadWithError:(NSError *)error {
CGFloat timer;
if (error == nil) {
[self w_closeTimer];
timer = 0.5;
self.strokeEnd = 1.0;
}else {
timer = 45.0;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timer * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (timer == 45.0) {
[self w_closeTimer];
}
self.hidden = YES;
[self removeFromSuperlayer];
});
}
#pragma mark - private
- (void)w_closeTimer {
[_timer invalidate];
_timer = nil;
}
- (void)dealloc {
[self w_closeTimer];
}
@end
3.WWebViewController.h
#import "YQViewController.h"
@interface WWebViewController : YQViewController
/** 相关链接*/
@property (nonatomic, copy) NSString *url;
/** 标题 */
@property (nonatomic, copy) NSString *webTitle;
/** 进度条颜色 */
@property (nonatomic, assign) UIColor *progressColor;
@end
WWebViewController.m
#import "WWebViewController.h"
#import "WWebProgressLayer.h"
#import
@interface WWebViewController ()
@property (nonatomic, strong)WKWebView *WWebView;
@property (nonatomic, strong)WWebProgressLayer *webProgressLayer;
@end
@implementation WWebViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
self.navigationItem.title = self.webTitle;
[self setUpUI];
}
- (void)setUpUI {
self.WWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
self.WWebView.backgroundColor = RGB(239, 239, 239);
self.WWebView.navigationDelegate =self;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURLURLWithString:self.url]];
[self.WWebView loadRequest:request];
[self.view addSubview:self.WWebView];
self.webProgressLayer = [[WWebProgressLayer alloc] init];
self.webProgressLayer.frame = CGRectMake(0, 42, APP_WIDTH, 2);
self.webProgressLayer.strokeColor = self.progressColor.CGColor;
[self.navigationController.navigationBar.layeraddSublayer:self.webProgressLayer];
}
#pragma mark - UIWebViewDelegate
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
[self.webProgressLayer w_startLoad];
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation*)navigation {
[self.webProgressLayer w_finishedLoadWithError:nil];
}
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
[self.webProgressLayer w_finishedLoadWithError:error];
}
- (void)dealloc {
[self.webProgressLayer w_closeTimer];
[_webProgressLayer removeFromSuperlayer];
_webProgressLayer = nil;
}
@end
4.调用
WWebViewController *WWebVC = [[WWebViewController alloc] init];
WWebVC.url =@"https://hr-ez.com/index/sharelist.html?uid=120";
WWebVC.webTitle = @"详情";
WWebVC.progressColor = [UIColor blueColor];
网友评论