RefreshTableView.m 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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.tableFooterView=_mLoadMore;
  29. // [mLoadMore release];
  30. // mLoadMore.backgroundColor = [UIColor redColor];
  31. _mRefreshHeader = [[RefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -_mTableView.bounds.size.height, _mTableView.frame.size.width, _mTableView.bounds.size.height)];
  32. [_mTableView addSubview:_mRefreshHeader];
  33. // [mRefreshHeader release];
  34. }
  35. return self;
  36. }
  37. - (void)setBackgroundColor:(UIColor *)color {
  38. [super setBackgroundColor:color];
  39. _mTableView.backgroundColor = color;
  40. }
  41. - (void)setSeparatorColor:(UIColor *)color {
  42. _mTableView.separatorColor = color;
  43. }
  44. - (UIColor *)separatorColor {
  45. return _mTableView.separatorColor;
  46. }
  47. - (void)setSeparatorStyle:(UITableViewCellSeparatorStyle)style {
  48. _mTableView.separatorStyle = style;
  49. }
  50. - (UITableViewCellSeparatorStyle)separatorStyle {
  51. return _mTableView.separatorStyle;
  52. }
  53. - (CGSize)contentSize {
  54. return _mTableView.contentSize;
  55. }
  56. - (CGPoint)contentOffset {
  57. return _mTableView.contentOffset;
  58. }
  59. - (void)setContentOffset:(CGPoint)Offset {
  60. _mTableView.contentOffset = Offset;
  61. }
  62. - (void)dealloc {
  63. // [super dealloc];
  64. }
  65. - (void)setMbMoreHidden:(BOOL)bHidden {
  66. _mLoadMore.hidden = bHidden;
  67. }
  68. - (BOOL)mbMoreHidden {
  69. return _mLoadMore.hidden;
  70. }
  71. - (void)setMbRefreshHidden:(BOOL)bHidden {
  72. _mRefreshHeader.hidden = bHidden;
  73. }
  74. - (BOOL)mbRefreshHidden {
  75. return _mRefreshHeader.hidden;
  76. }
  77. - (void)reloadData {
  78. [_mTableView reloadData];
  79. [self.mTableView setContentOffset:CGPointMake(0,0) animated:NO];
  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. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
  98. {
  99. if (delegate && [delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) {
  100. return [delegate tableView:tableView viewForHeaderInSection:section];
  101. }
  102. return nil;
  103. }
  104. //tableview分区的间隔高度
  105. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
  106. {
  107. if (delegate && [delegate respondsToSelector:@selector(tableView:heightForHeaderInSection:)]) {
  108. return [delegate tableView:tableView heightForHeaderInSection:section];
  109. }
  110. return 0;
  111. }
  112. - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  113. {
  114. if (delegate && [delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
  115. return [delegate tableView:tableView heightForRowAtIndexPath:indexPath];
  116. }
  117. return 40;
  118. }
  119. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  120. {
  121. if (delegate && [delegate respondsToSelector:@selector(tableView:cellForRowAtIndexPath:)]) {
  122. return [delegate tableView:tableView cellForRowAtIndexPath:indexPath];
  123. }
  124. return nil;
  125. }
  126. -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
  127. if (delegate && [delegate respondsToSelector:@selector(tableView:estimatedHeightForRowAtIndexPath:)]) {
  128. return [delegate tableView:tableView estimatedHeightForRowAtIndexPath:indexPath];
  129. }
  130. return 250;
  131. }
  132. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  133. if (delegate && [delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) {
  134. [delegate tableView:tableView didSelectRowAtIndexPath:indexPath];
  135. }
  136. }
  137. - (BOOL)CanRefresh {
  138. if (delegate && [delegate respondsToSelector:@selector(CanRefreshTableView:)]) {
  139. return [delegate CanRefreshTableView:self];
  140. }
  141. return NO;
  142. }
  143. //scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次
  144. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  145. if (delegate && [delegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
  146. [delegate scrollViewDidScroll:scrollView];
  147. // if (scrollView.isDragging) {//显示下拉更新
  148. //
  149. // if (mRefreshHeader.state == PullRefreshPulling && scrollView.contentOffset.y > -65.0f && scrollView.contentOffset.y < 0.0f && [self CanRefresh]) {
  150. // [mRefreshHeader setState:PullRefreshNormal];
  151. // }
  152. // else if (mRefreshHeader.state == PullRefreshNormal && scrollView.contentOffset.y < -65.0f && [self CanRefresh]) {//显示松开更新
  153. // [mRefreshHeader setState:PullRefreshPulling];
  154. // }
  155. //
  156. // }
  157. }
  158. }
  159. // 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。
  160. // decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES
  161. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  162. if (scrollView.contentOffset.y <= - 65.0f && [self CanRefresh]) {
  163. [_mRefreshHeader setState:PullRefreshLoading];
  164. //int iBotHeight = mLoadMore.hidden ? miBotOffset : miBotOffset+40;
  165. int iBotHeight = 0;
  166. [UIView beginAnimations:nil context:NULL];
  167. [UIView setAnimationDuration:0.2];
  168. // mTableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, iBotHeight, 0.0f);
  169. //上边、左边、下边、右边
  170. _mTableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, iBotHeight, 0.0f);
  171. _mTableView.contentOffset = CGPointMake(0, -60);
  172. [UIView commitAnimations];
  173. if (delegate && [delegate respondsToSelector:@selector(ReloadList:)]) {
  174. return [delegate ReloadList:self];
  175. }
  176. }
  177. }
  178. // 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。
  179. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  180. // int iOffset = scrollView.contentOffset.y+scrollView.frame.size.height-scrollView.contentSize.height;
  181. }
  182. - (void)OnLoadMoreClick {
  183. if (!_mLoadMore.hidden && [self CanRefresh]) {
  184. [_mLoadMore StartLoading];
  185. if (delegate && [delegate respondsToSelector:@selector(LoadMoreList:)]) {
  186. return [delegate LoadMoreList:self];
  187. }
  188. }
  189. }
  190. - (void)FinishLoading {
  191. int iBotHeight=0;
  192. [UIView beginAnimations:nil context:NULL];
  193. [UIView setAnimationDuration:.3];
  194. [_mTableView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, iBotHeight, 0.0f)];
  195. [UIView commitAnimations];
  196. [_mRefreshHeader setState:PullRefreshNormal];
  197. [_mRefreshHeader setCurrentDate];
  198. [_mLoadMore StopLoading];
  199. }
  200. @end