120 lines
2.5 KiB
Objective-C
Executable File
120 lines
2.5 KiB
Objective-C
Executable File
//
|
||
// YJWebProgressLayer.m
|
||
// YJWebProgressLayer
|
||
//
|
||
// Created by Kean on 2016/12/15.
|
||
// Copyright © 2016年 Kean. All rights reserved.
|
||
//
|
||
|
||
#import "YJWebProgressLayer.h"
|
||
#import "NSTimer+addition.h"
|
||
|
||
//#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
|
||
|
||
static NSTimeInterval const kFastTimeInterval = 0.03;
|
||
|
||
|
||
@interface YJWebProgressLayer ()
|
||
|
||
@property (nonatomic, strong) CAShapeLayer *layer;
|
||
@property (nonatomic, strong) NSTimer *timer;
|
||
@property (nonatomic, assign) CGFloat plusWidth; // 线条分为无数个点,线条的增加点的宽度
|
||
|
||
@end
|
||
|
||
@implementation YJWebProgressLayer
|
||
|
||
- (instancetype)init {
|
||
|
||
if (self = [super init]) {
|
||
[self initialize];
|
||
}
|
||
|
||
return self;
|
||
}
|
||
|
||
- (void)dealloc {
|
||
|
||
[self closeTimer];
|
||
}
|
||
|
||
- (void)initialize {
|
||
|
||
// 绘制贝赛尔曲线
|
||
UIBezierPath * path = [UIBezierPath bezierPath];
|
||
[path moveToPoint:CGPointMake(0, 3)]; // 起点
|
||
[path addLineToPoint:CGPointMake(SCREEN_WIDTH, 3)]; // 终点
|
||
|
||
self.path = path.CGPath;
|
||
self.strokeEnd = 0;
|
||
_plusWidth = 0.005;
|
||
|
||
self.lineWidth = 2;
|
||
self.strokeColor = [UIColor orangeColor].CGColor; // 设置进度条的颜色
|
||
|
||
_timer = [NSTimer scheduledTimerWithTimeInterval:kFastTimeInterval target:self selector:@selector(pathChanged:) userInfo:nil repeats:YES];
|
||
[_timer 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;
|
||
}
|
||
|
||
}
|
||
|
||
// 使用的是 WKWebView 在用KVO计算实际的读取进度时,调用该方法
|
||
- (void)wkWebViewPathChanged:(CGFloat)estimatedProgress {
|
||
|
||
self.strokeEnd = estimatedProgress;
|
||
|
||
}
|
||
|
||
- (void)startLoad {
|
||
|
||
[_timer webPageTimeWithTimeInterval:kFastTimeInterval];
|
||
|
||
}
|
||
|
||
- (void)finishedLoadWithError:(NSError *)error {
|
||
|
||
CGFloat timer;
|
||
|
||
if (error == nil) {
|
||
[self 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 closeTimer];
|
||
self.hidden = YES;
|
||
[self removeFromSuperlayer];
|
||
});
|
||
|
||
}
|
||
|
||
#pragma mark - private
|
||
- (void)closeTimer {
|
||
|
||
[_timer invalidate];
|
||
_timer = nil;
|
||
|
||
}
|
||
@end
|