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 //下拉视图 8 EGORefreshTableHeaderView * _refreshHeaderView; 9 //刷新标识,是否正在刷新过程中 10 BOOL _reloading; 11 } 12 13 @property(weak, nonatomic) IBOutlet UIWebView *uiWebView; 14 15 @end
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 [super viewDidLoad]; 14 //webview 和 webview 的 scrollView 的委托都设置为self 15 self.uiWebView.delegate = self; 16 self.uiWebView.scrollView.delegate = self; 17 [self loadPage]; 18 19 //初始化refreshView,添加到webview 的 scrollView子视图中 20 if (_refreshHeaderView == nil) { 21 _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 _refreshHeaderView.delegate = self; 23 [self.uiWebView.scrollView addSubview:_refreshHeaderView]; 24 } 25 [_refreshHeaderView refreshLastUpdatedDate]; 26 } 27 28 - (void)didReceiveMemoryWarning 29 { 30 [super didReceiveMemoryWarning]; 31 } 32 33 //加载网页 34 - (void)loadPage { 35 NSURL *url = [[NSURL alloc] initWithString:@URL_INDEX]; 36 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 37 [self.uiWebView loadRequest:request]; 38 } 39 40 #pragma mark - webview delegate 41 42 - (void)webViewDidStartLoad:(UIWebView *)webView { 43 _reloading = YES; 44 } 45 - (void)webViewDidFinishLoad:(UIWebView *)webView { 46 _reloading = NO; 47 [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.uiWebView.scrollView]; 48 } 49 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 50 NSLog(@"load page error:%@", [error description]); 51 _reloading = NO; 52 [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.uiWebView.scrollView]; 53 } 54 55 56 #pragma mark - 57 #pragma mark UIScrollViewDelegate Methods 58 59 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 60 [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView]; 61 } 62 63 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 64 [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; 65 } 66 67 -(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ 68 [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; 69 } 70 71 #pragma mark - 72 #pragma mark EGORefreshTableHeaderDelegate Methods 73 74 - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{ 75 76 [self loadPage]; 77 } 78 79 - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{ 80 81 return _reloading; // should return if data source model is reloading 82 83 } 84 85 - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{ 86 87 return [NSDate date]; // should return date data source was last changed 88 } 89 90 @end
这里需要注意的是,几处关于用到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下拉更新开源控件)
参考:
(备份为Scrollview下拉更新开源控件)
浙公网安备 33010602011771号