RefreshTableView.m 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // RefreshTableView.m
  3. // MicroVideo
  4. //
  5. // Created by Hepburn Alex on 12-11-23.
  6. // Copyright (c) 2012年 wei. All rights reserved.
  7. //
  8. #import "RefreshTableView.h"
  9. @implementation RefreshTableView
  10. @synthesize delegate, mbMoreHidden, mbRefreshHidden, separatorColor, separatorStyle, miBotOffset, contentSize, contentOffset;
  11. - (id)initWithFrame:(CGRect)frame
  12. {
  13. self = [super initWithFrame:frame];
  14. if (self) {
  15. miBotOffset = 0;
  16. _mTableView = [[UITableView alloc] initWithFrame:self.bounds];
  17. _mTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
  18. _mTableView.delegate = self;
  19. _mTableView.dataSource = self;
  20. _mTableView.backgroundColor = [UIColor colorWithRed:0.87 green:0.88 blue:0.91 alpha:1.0];
  21. [self addSubview:_mTableView];
  22. // [mTableView release];
  23. _mTableView.frame=CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
  24. _mLoadMore = [[LoadMoreView alloc] initWithFrame:CGRectMake(10, 0, _mTableView.frame.size.width-20, 32)];
  25. _mLoadMore.delegate = self;
  26. _mLoadMore.OnLoadMore = @selector(OnLoadMoreClick);
  27. _mLoadMore.hidden = YES;
  28. // [mTableView addSubview:mLoadMore];
  29. _mTableView.tableFooterView=_mLoadMore;
  30. // [mLoadMore release];
  31. // mLoadMore.backgroundColor=[UIColor redColor];
  32. _mRefreshHeader = [[RefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -_mTableView.bounds.size.height, _mTableView.frame.size.width, _mTableView.bounds.size.height)];
  33. [_mTableView addSubview:_mRefreshHeader];
  34. // [mRefreshHeader release];
  35. }
  36. return self;
  37. }
  38. - (void)setBackgroundColor:(UIColor *)color {
  39. [super setBackgroundColor:color];
  40. _mTableView.backgroundColor = color;
  41. }
  42. - (void)setSeparatorColor:(UIColor *)color {
  43. _mTableView.separatorColor = color;
  44. }
  45. - (UIColor *)separatorColor {
  46. return _mTableView.separatorColor;
  47. }
  48. - (void)setSeparatorStyle:(UITableViewCellSeparatorStyle)style {
  49. _mTableView.separatorStyle = style;
  50. }
  51. - (UITableViewCellSeparatorStyle)separatorStyle {
  52. return _mTableView.separatorStyle;
  53. }
  54. - (CGSize)contentSize {
  55. return _mTableView.contentSize;
  56. }
  57. - (CGPoint)contentOffset {
  58. return _mTableView.contentOffset;
  59. }
  60. - (void)setContentOffset:(CGPoint)Offset {
  61. _mTableView.contentOffset = Offset;
  62. }
  63. - (void)dealloc {
  64. // [super dealloc];
  65. }
  66. - (void)setMbMoreHidden:(BOOL)bHidden {
  67. _mLoadMore.hidden = bHidden;
  68. }
  69. - (BOOL)mbMoreHidden {
  70. return _mLoadMore.hidden;
  71. }
  72. - (void)setMbRefreshHidden:(BOOL)bHidden {
  73. _mRefreshHeader.hidden = bHidden;
  74. }
  75. - (BOOL)mbRefreshHidden {
  76. return _mRefreshHeader.hidden;
  77. }
  78. - (void)reloadData {
  79. [_mTableView reloadData];
  80. // int iTop = mTableView.contentSize.height;
  81. //mLoadMore.frame = CGRectMake(10, iTop, mTableView.frame.size.width-20, 32);
  82. }
  83. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  84. {
  85. if (delegate && [delegate respondsToSelector:@selector(numberOfSectionsInTableView:)]) {
  86. return [delegate numberOfSectionsInTableView:tableView];
  87. }
  88. return 0;
  89. }
  90. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  91. {
  92. if (delegate && [delegate respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) {
  93. return [delegate tableView:tableView numberOfRowsInSection:section];
  94. }
  95. return 0;
  96. }
  97. - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  98. {
  99. if (delegate && [delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
  100. return [delegate tableView:tableView heightForRowAtIndexPath:indexPath];
  101. }
  102. return 40;
  103. }
  104. -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
  105. if (delegate && [delegate respondsToSelector:@selector(tableView:estimatedHeightForRowAtIndexPath:)]) {
  106. return [delegate tableView:tableView estimatedHeightForRowAtIndexPath:indexPath];
  107. }
  108. return 250;
  109. }
  110. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  111. {
  112. if (delegate && [delegate respondsToSelector:@selector(tableView:cellForRowAtIndexPath:)]) {
  113. return [delegate tableView:tableView cellForRowAtIndexPath:indexPath];
  114. }
  115. return nil;
  116. }
  117. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  118. if (delegate && [delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) {
  119. [delegate tableView:tableView didSelectRowAtIndexPath:indexPath];
  120. }
  121. }
  122. - (BOOL)CanRefresh {
  123. if (delegate && [delegate respondsToSelector:@selector(CanRefreshTableView:)]) {
  124. return [delegate CanRefreshTableView:self];
  125. }
  126. return NO;
  127. }
  128. //scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次
  129. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  130. if (delegate && [delegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
  131. [delegate scrollViewDidScroll:scrollView];
  132. // if (scrollView.isDragging) {//显示下拉更新
  133. //
  134. // if (mRefreshHeader.state == PullRefreshPulling && scrollView.contentOffset.y > -65.0f && scrollView.contentOffset.y < 0.0f && [self CanRefresh]) {
  135. // [mRefreshHeader setState:PullRefreshNormal];
  136. // }
  137. // else if (mRefreshHeader.state == PullRefreshNormal && scrollView.contentOffset.y < -65.0f && [self CanRefresh]) {//显示松开更新
  138. // [mRefreshHeader setState:PullRefreshPulling];
  139. // }
  140. //
  141. // }
  142. }
  143. }
  144. // 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。
  145. // decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES
  146. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  147. if (scrollView.contentOffset.y <= - 65.0f && [self CanRefresh]) {
  148. [_mRefreshHeader setState:PullRefreshLoading];
  149. //int iBotHeight = mLoadMore.hidden ? miBotOffset : miBotOffset+40;
  150. int iBotHeight = 0;
  151. [UIView beginAnimations:nil context:NULL];
  152. [UIView setAnimationDuration:0.2];
  153. // mTableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, iBotHeight, 0.0f);
  154. //上边、左边、下边、右边
  155. _mTableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, iBotHeight, 0.0f);
  156. _mTableView.contentOffset = CGPointMake(0, -60);
  157. [UIView commitAnimations];
  158. if (delegate && [delegate respondsToSelector:@selector(ReloadList:)]) {
  159. return [delegate ReloadList:self];
  160. }
  161. }
  162. }
  163. // 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。
  164. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  165. // int iOffset = scrollView.contentOffset.y+scrollView.frame.size.height-scrollView.contentSize.height;
  166. }
  167. - (void)OnLoadMoreClick {
  168. if (!_mLoadMore.hidden && [self CanRefresh]) {
  169. [_mLoadMore StartLoading];
  170. if (delegate && [delegate respondsToSelector:@selector(LoadMoreList:)]) {
  171. return [delegate LoadMoreList:self];
  172. }
  173. }
  174. }
  175. - (void)FinishLoading {
  176. int iBotHeight=0;
  177. [UIView beginAnimations:nil context:NULL];
  178. [UIView setAnimationDuration:.3];
  179. [_mTableView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, iBotHeight, 0.0f)];
  180. [UIView commitAnimations];
  181. [_mRefreshHeader setState:PullRefreshNormal];
  182. [_mRefreshHeader setCurrentDate];
  183. [_mLoadMore StopLoading];
  184. }
  185. @end