iOS UIWebView下拉刷新实现

转自:http://blog.csdn.net/fangzhangsc2006/article/details/9011429

网上关于给UITableView实现下拉刷新效果的帖子较多,但是给UIWebView实现的比较少。还好在code4app网站上找到一篇给UIScrollView和UITableView实现下拉刷新的demo【下载地址】。它其中用到的开源控件是EGORefreshTableHeaderView。虽然名字是EGORefreshTableHeaderView,但是它其实可以用于所有UIScrollView,而UIWebView其实也算是一个UIScrollView,所以该控件也是可以用于UIWebView的。

我参照code4app的例子给我的UIWebView加上了下拉刷新的功能,在UIWebView上使用稍微有点不一样的地方。

.h文件中主要代码如下

 1 #import <UIKit/UIKit.h>
 2 #import "EGORefreshTableHeaderView.h"
 3 
 4 #define URL_INDEX "http://www.sogou.com"
 5 
 6 @interface ViewController : UIViewController <UIWebViewDelegate, UIScrollViewDelegate, EGORefreshTableHeaderDelegate> {
 7 &nbsp;&nbsp;&nbsp; //下拉视图
 8 &nbsp;&nbsp;&nbsp; EGORefreshTableHeaderView * _refreshHeaderView;
 9 &nbsp;&nbsp;&nbsp; //刷新标识,是否正在刷新过程中
10 &nbsp;&nbsp;&nbsp; BOOL _reloading;
11 }
12 
13 @property(weak, nonatomic) IBOutlet UIWebView *uiWebView;
14 
15 @end
View Code
.m文件中的代码
 1 #import "ViewController.h"
 2 
 3 @interface ViewController ()
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 @synthesize uiWebView;
10 
11 - (void)viewDidLoad
12 {
13 &nbsp;&nbsp;&nbsp; [super viewDidLoad];
14 &nbsp;&nbsp;&nbsp; //webview 和 webview 的 scrollView 的委托都设置为self
15 &nbsp;&nbsp;&nbsp; self.uiWebView.delegate = self;
16 &nbsp;&nbsp;&nbsp; self.uiWebView.scrollView.delegate = self;
17 &nbsp;&nbsp;&nbsp; [self loadPage];
18 &nbsp;&nbsp; &nbsp;
19 &nbsp;&nbsp;&nbsp; //初始化refreshView,添加到webview 的 scrollView子视图中
20 &nbsp;&nbsp;&nbsp; if (_refreshHeaderView == nil) {
21 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _refreshHeaderView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, 0-self.uiWebView.scrollView.bounds.size.height, self.uiWebView.scrollView.frame.size.width, self.uiWebView.scrollView.bounds.size.height)];
22 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _refreshHeaderView.delegate = self;
23 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [self.uiWebView.scrollView addSubview:_refreshHeaderView];
24 &nbsp;&nbsp;&nbsp; }
25 &nbsp;&nbsp;&nbsp; [_refreshHeaderView refreshLastUpdatedDate];
26 }
27 
28 - (void)didReceiveMemoryWarning
29 {
30 &nbsp;&nbsp;&nbsp; [super didReceiveMemoryWarning];
31 }
32 
33 //加载网页
34 - (void)loadPage {
35 &nbsp;&nbsp;&nbsp; NSURL *url = [[NSURL alloc] initWithString:@URL_INDEX];
36 &nbsp;&nbsp;&nbsp; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
37 &nbsp;&nbsp;&nbsp; [self.uiWebView loadRequest:request];
38 }
39 
40 #pragma mark - webview delegate
41 
42 - (void)webViewDidStartLoad:(UIWebView *)webView {
43 &nbsp;&nbsp;&nbsp; _reloading = YES;
44 }
45 - (void)webViewDidFinishLoad:(UIWebView *)webView {
46 &nbsp;&nbsp;&nbsp; _reloading = NO;
47 &nbsp;&nbsp;&nbsp; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.uiWebView.scrollView];
48 }
49 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
50 &nbsp;&nbsp;&nbsp; NSLog(@"load page error:%@", [error description]);
51 &nbsp;&nbsp;&nbsp; _reloading = NO;
52 &nbsp;&nbsp; &nbsp;[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.uiWebView.scrollView];
53 }
54 
55 
56 #pragma mark -
57 #pragma mark UIScrollViewDelegate Methods
58 
59 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
60 &nbsp;&nbsp; &nbsp;[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
61 }
62 
63 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
64 &nbsp;&nbsp; &nbsp;[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
65 }
66 
67 -(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
68 &nbsp;&nbsp;&nbsp; [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
69 }
70 
71 #pragma mark -
72 #pragma mark EGORefreshTableHeaderDelegate Methods
73 
74 - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
75 &nbsp;&nbsp; &nbsp;
76 &nbsp;&nbsp; &nbsp;[self loadPage];
77 }
78 
79 - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
80 &nbsp;&nbsp; &nbsp;
81 &nbsp;&nbsp; &nbsp;return _reloading; // should return if data source model is reloading
82 &nbsp;&nbsp; &nbsp;
83 }
84 
85 - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
86 &nbsp;&nbsp; &nbsp;
87 &nbsp;&nbsp; &nbsp;return [NSDate date]; // should return date data source was last changed
88 }
89 
90 @end
View Code

 

 

这里需要注意的是,几处关于用到UIWebView尺寸的地方不是self.uiWebView.bounds,而应该是self.uiWebView.scrollView.bounds。这也说明UIWebView与UIScrollView不是继承的关系,而是组合的关系。

此Demo的下载地址:

http://code4app.com/ios/UIWebView-%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0/51aee3c16803fa770f000003

(备份为UIWebView下拉更新开源控件

参考:

http://code4app.com/ios/scrollview%E5%92%8Ctable%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0/5025fdbe6803fa923e000000

 (备份为Scrollview下拉更新开源控件)

 

posted on 2013-07-19 14:40  许木木  阅读(557)  评论(0)    收藏  举报

导航