iOS WKWebView带进度条封装(只用传入url,可改变进度条颜色)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/walkerwqp/article/details/80005967

1 NSTimer+addition.h

#import <Foundation/Foundation.h>

@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 <QuartzCore/QuartzCore.h>

@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 <UIKit/UIKit.h>

#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:ProgressTimeInterval target: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 <WebKit/WebKit.h>

@interface WWebViewController ()<WKNavigationDelegate>

@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:[NSURL URLWithString: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.layer addSublayer: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];

猜你喜欢

转载自blog.csdn.net/walkerwqp/article/details/80005967