NJKWebViewProgress实现分析

NJKWebViewProgress是一个能使UIWebview显示加载进度的第三方控件。在网上以“UIWebview+进度”为关键字搜索,NJKWebViewProgress是前几名的解决方法。

以下分析该控件的实现方式。


NJKWebViewProgress实现分析_第1张图片
NJKWebViewProgress目录结构

使用方式

@property(weak,nonatomic) UIWebView *uiwebView;

@property(strong,nonatomic,readwrite) NJKWebViewProgressView *progressView;

@property(strong,nonatomic,readwrite) NJKWebViewProgress *progressProxy;

- (void)configProgress {

self.progressProxy= [[NJKWebViewProgressalloc]init];

self.uiwebView.delegate=self.progressProxy;

self.progressProxy.webViewProxyDelegate=self;

self.progressProxy.progressDelegate=self;

CGRect barFrame = ...;

self.progressView= [[NJKWebViewProgressViewalloc]initWithFrame:barFrame];

[destView addSubview:self.progressView];

}

#pragma mark - NJKWebViewProgressDelegate

-(void)webViewProgress:(NJKWebViewProgress*)webViewProgress updateProgress:(float)progress

{

[self.progressView setProgress:progress animated:YES];

}

使用方法很简单,大意是

设置UIWebVIew的delegate为progressProxy

设置progressProxy.webViewProxyDelegate为self

设置progressProxy.progressDelegate为self

将progressView添加到需要的位置

通过progressProxy.progressDelegate的实现方法,在self中修改progressView的progress值

实现分析

从上文的使用方法中,已经能看出progressProxy提供progress值,progressView显示progress值,所以只需分析progressProxy如何得到进度即可。

@property(nonatomic, njk_weak) id webViewProxyDelegate;

可以发现,使用的仍然是UIWebView的代理方法。而UIWebView本身是没有提供进度查询方法的,所以NJKWebViewProgress在这里又是怎么解决这个问题的呢?

const float NJKInitialProgressValue =0.1f;

const float NJKInteractiveProgressValue =0.5f;

const float NJKFinalProgressValue =0.9f;


NJKWebViewProgress实现分析_第2张图片
NJKWebViewProgress 大致实现图

分析代码以后,发现其中的实现大致如上图所示。按照具体情况将进度设置为

0->0.1->(0.5->)0.9->1

是一个根据状态来决定当前进度的实现思路。

NJKWebViewProgress实现分析_第3张图片


总结

虽然NJKWebViewProgress从本质来说是一个假进度条,但是它的显示效果确实不错。使用方便,扩展性强,而且能使用cocoaPods管理,是一个非常不错的控件。


以上仅是个人理解,如果有谬误,请指正!

00000003

你可能感兴趣的:(NJKWebViewProgress实现分析)