MJRefreshHeaderView.m 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // MJRefreshHeaderView.m
  3. // MJRefresh
  4. //
  5. // Created by mj on 13-2-26.
  6. // Copyright (c) 2013年 itcast. All rights reserved.
  7. // 下拉刷新
  8. #import "MJRefreshConst.h"
  9. #import "MJRefreshHeaderView.h"
  10. @interface MJRefreshHeaderView()
  11. // 最后的更新时间
  12. @property (nonatomic, strong) NSDate *lastUpdateTime;
  13. @end
  14. @implementation MJRefreshHeaderView
  15. + (instancetype)header
  16. {
  17. return [[MJRefreshHeaderView alloc] init];
  18. }
  19. -(void)dealloc{
  20. NSLog(@"MJRefreshHeaderView.dealloc");
  21. }
  22. #pragma mark - UIScrollView相关
  23. #pragma mark 重写设置ScrollView
  24. - (void)setScrollView:(UIScrollView *)scrollView
  25. {
  26. [super setScrollView:scrollView];
  27. // 1.设置边框
  28. self.frame = CGRectMake(0, - MJRefreshViewHeight, scrollView.frame.size.width, MJRefreshViewHeight);
  29. // 2.加载时间
  30. self.lastUpdateTime = [[NSUserDefaults standardUserDefaults] objectForKey:MJRefreshHeaderTimeKey];
  31. }
  32. #pragma mark - 状态相关
  33. #pragma mark 设置最后的更新时间
  34. - (void)setLastUpdateTime:(NSDate *)lastUpdateTime
  35. {
  36. _lastUpdateTime = lastUpdateTime;
  37. // 1.归档
  38. [[NSUserDefaults standardUserDefaults] setObject:_lastUpdateTime forKey:MJRefreshHeaderTimeKey];
  39. [[NSUserDefaults standardUserDefaults] synchronize];
  40. // 2.更新时间
  41. [self updateTimeLabel];
  42. }
  43. #pragma mark 更新时间字符串
  44. - (void)updateTimeLabel
  45. {
  46. if (!_lastUpdateTime) return;
  47. // 1.获得年月日
  48. NSCalendar *calendar = [NSCalendar currentCalendar];
  49. NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute;
  50. NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:_lastUpdateTime];
  51. NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]];
  52. // 2.格式化日期
  53. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  54. if ([cmp1 day] == [cmp2 day]) { // 今天
  55. formatter.dateFormat = [NSString stringWithFormat:@" HH:mm"];
  56. } else if ([cmp1 year] == [cmp2 year]) { // 今年
  57. formatter.dateFormat = @"MM-dd HH:mm";
  58. } else {
  59. formatter.dateFormat = @"yyyy-MM-dd HH:mm";
  60. }
  61. NSString *time = [formatter stringFromDate:_lastUpdateTime];
  62. // 3.显示日期
  63. _lastUpdateTimeLabel.text = [NSString stringWithFormat:@"%@:%@",Localized(@"MJRefreshHeaderView_UpdateLate"), time];
  64. }
  65. #pragma mark 设置状态
  66. - (void)setState:(MJRefreshState)state
  67. {
  68. // 1.一样的就直接返回
  69. if (_state == state) return;
  70. // 2.保存旧状态
  71. MJRefreshState oldState = _state;
  72. // 3.调用父类方法
  73. [super setState:state];
  74. // 4.根据状态执行不同的操作
  75. switch (state) {
  76. case MJRefreshStatePulling: // 松开可立即刷新
  77. {
  78. // 设置文字
  79. if (_pullShowStr.length>0) {
  80. _statusLabel.text = _pullShowStr;
  81. _statusLabel.textColor = [UIColor whiteColor];
  82. }else{
  83. _statusLabel.text = MJRefreshHeaderReleaseToRefresh;
  84. }
  85. // 执行动画
  86. [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
  87. _arrowImage.transform = CGAffineTransformMakeRotation(M_PI);
  88. UIEdgeInsets inset = _scrollView.contentInset;
  89. inset.top = _scrollViewInitInset.top;
  90. _scrollView.contentInset = inset;
  91. }];
  92. break;
  93. }
  94. case MJRefreshStateNormal: // 下拉可以刷新
  95. {
  96. // 设置文字
  97. if (_pullShowStr.length>0) {
  98. _statusLabel.textColor = [UIColor whiteColor];
  99. _statusLabel.text = _pullShowStr;
  100. }else{
  101. _statusLabel.text = MJRefreshHeaderPullToRefresh;
  102. _statusLabel.text = MJRefreshHeaderReleaseToRefresh;
  103. }
  104. // 执行动画
  105. [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
  106. _arrowImage.transform = CGAffineTransformIdentity;
  107. UIEdgeInsets inset = _scrollView.contentInset;
  108. inset.top = _scrollViewInitInset.top;
  109. _scrollView.contentInset = inset;
  110. }];
  111. // 刷新完毕
  112. if (MJRefreshStateRefreshing == oldState) {
  113. // 保存刷新时间
  114. self.lastUpdateTime = [NSDate date];
  115. }
  116. break;
  117. }
  118. case MJRefreshStateRefreshing: // 正在刷新中
  119. {
  120. // 设置文字
  121. _statusLabel.text = MJRefreshHeaderRefreshing;
  122. // 执行动画
  123. [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
  124. _arrowImage.transform = CGAffineTransformIdentity;
  125. // 1.增加65的滚动区域
  126. UIEdgeInsets inset = _scrollView.contentInset;
  127. inset.top = _scrollViewInitInset.top + MJRefreshViewHeight;
  128. _scrollView.contentInset = inset;
  129. // 2.设置滚动位置
  130. _scrollView.contentOffset = CGPointMake(0, - _scrollViewInitInset.top - MJRefreshViewHeight);
  131. }];
  132. break;
  133. }
  134. default:
  135. break;
  136. }
  137. }
  138. #pragma mark - 在父类中用得上
  139. // 合理的Y值(刚好看到下拉刷新控件时的contentOffset.y,取相反数)
  140. - (CGFloat)validY
  141. {
  142. return _scrollViewInitInset.top;
  143. }
  144. // view的类型
  145. - (int)viewType
  146. {
  147. return MJRefreshViewTypeHeader;
  148. }
  149. @end