美文网首页
iOS WKWebView带进度条封装(只用传入url,可改变进

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

作者: 龍飝 | 来源:发表于2018-04-19 16:16 被阅读78次

    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];

    相关文章

      网友评论

          本文标题:iOS WKWebView带进度条封装(只用传入url,可改变进

          本文链接:https://www.haomeiwen.com/subject/zoiwkftx.html