NJKWebViewProgress是一个能使UIWebview显示加载进度的第三方控件。在网上以“UIWebview+进度”为关键字搜索,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<UIWebViewDelegate> webViewProxyDelegate;
可以发现,使用的仍然是UIWebView的代理方法。而UIWebView本身是没有提供进度查询方法的,所以NJKWebViewProgress在这里又是怎么解决这个问题的呢?
const float NJKInitialProgressValue =0.1f;
const float NJKInteractiveProgressValue =0.5f;
const float NJKFinalProgressValue =0.9f;
分析代码以后,发现其中的实现大致如上图所示。按照具体情况将进度设置为
0->0.1->(0.5->)0.9->1
是一个根据状态来决定当前进度的实现思路。
总结
虽然NJKWebViewProgress从本质来说是一个假进度条,但是它的显示效果确实不错。使用方便,扩展性强,而且能使用cocoaPods管理,是一个非常不错的控件。
以上仅是个人理解,如果有谬误,请指正!
00000003