123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //
- // MJRefreshHeaderView.m
- // MJRefresh
- //
- // Created by mj on 13-2-26.
- // Copyright (c) 2013年 itcast. All rights reserved.
- // 下拉刷新
- #import "MJRefreshConst.h"
- #import "MJRefreshHeaderView.h"
- @interface MJRefreshHeaderView()
- // 最后的更新时间
- @property (nonatomic, strong) NSDate *lastUpdateTime;
- @end
- @implementation MJRefreshHeaderView
- + (instancetype)header
- {
- return [[MJRefreshHeaderView alloc] init];
- }
- -(void)dealloc{
- NSLog(@"MJRefreshHeaderView.dealloc");
- }
- #pragma mark - UIScrollView相关
- #pragma mark 重写设置ScrollView
- - (void)setScrollView:(UIScrollView *)scrollView
- {
- [super setScrollView:scrollView];
-
- // 1.设置边框
- self.frame = CGRectMake(0, - MJRefreshViewHeight, scrollView.frame.size.width, MJRefreshViewHeight);
-
- // 2.加载时间
- self.lastUpdateTime = [[NSUserDefaults standardUserDefaults] objectForKey:MJRefreshHeaderTimeKey];
- }
- #pragma mark - 状态相关
- #pragma mark 设置最后的更新时间
- - (void)setLastUpdateTime:(NSDate *)lastUpdateTime
- {
- _lastUpdateTime = lastUpdateTime;
-
- // 1.归档
- [[NSUserDefaults standardUserDefaults] setObject:_lastUpdateTime forKey:MJRefreshHeaderTimeKey];
- [[NSUserDefaults standardUserDefaults] synchronize];
-
- // 2.更新时间
- [self updateTimeLabel];
- }
- #pragma mark 更新时间字符串
- - (void)updateTimeLabel
- {
- if (!_lastUpdateTime) return;
-
- // 1.获得年月日
- NSCalendar *calendar = [NSCalendar currentCalendar];
- NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute;
- NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:_lastUpdateTime];
- NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]];
-
- // 2.格式化日期
- NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- if ([cmp1 day] == [cmp2 day]) { // 今天
- formatter.dateFormat = [NSString stringWithFormat:@" HH:mm"];
- } else if ([cmp1 year] == [cmp2 year]) { // 今年
- formatter.dateFormat = @"MM-dd HH:mm";
- } else {
- formatter.dateFormat = @"yyyy-MM-dd HH:mm";
- }
- NSString *time = [formatter stringFromDate:_lastUpdateTime];
-
- // 3.显示日期
- _lastUpdateTimeLabel.text = [NSString stringWithFormat:@"%@:%@",Localized(@"MJRefreshHeaderView_UpdateLate"), time];
-
- }
- #pragma mark 设置状态
- - (void)setState:(MJRefreshState)state
- {
- // 1.一样的就直接返回
- if (_state == state) return;
-
- // 2.保存旧状态
- MJRefreshState oldState = _state;
-
- // 3.调用父类方法
- [super setState:state];
-
- // 4.根据状态执行不同的操作
- switch (state) {
- case MJRefreshStatePulling: // 松开可立即刷新
- {
- // 设置文字
- if (_pullShowStr.length>0) {
-
- _statusLabel.text = _pullShowStr;
- _statusLabel.textColor = [UIColor whiteColor];
- }else{
- _statusLabel.text = MJRefreshHeaderReleaseToRefresh;
- }
- // 执行动画
- [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
- _arrowImage.transform = CGAffineTransformMakeRotation(M_PI);
- UIEdgeInsets inset = _scrollView.contentInset;
- inset.top = _scrollViewInitInset.top;
- _scrollView.contentInset = inset;
- }];
- break;
- }
-
- case MJRefreshStateNormal: // 下拉可以刷新
- {
- // 设置文字
- if (_pullShowStr.length>0) {
-
- _statusLabel.textColor = [UIColor whiteColor];
- _statusLabel.text = _pullShowStr;
- }else{
-
- _statusLabel.text = MJRefreshHeaderPullToRefresh;
- _statusLabel.text = MJRefreshHeaderReleaseToRefresh;
-
- }
- // 执行动画
- [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
- _arrowImage.transform = CGAffineTransformIdentity;
- UIEdgeInsets inset = _scrollView.contentInset;
- inset.top = _scrollViewInitInset.top;
- _scrollView.contentInset = inset;
- }];
-
- // 刷新完毕
- if (MJRefreshStateRefreshing == oldState) {
- // 保存刷新时间
- self.lastUpdateTime = [NSDate date];
- }
- break;
- }
-
- case MJRefreshStateRefreshing: // 正在刷新中
- {
- // 设置文字
- _statusLabel.text = MJRefreshHeaderRefreshing;
- // 执行动画
- [UIView animateWithDuration:MJRefreshAnimationDuration animations:^{
- _arrowImage.transform = CGAffineTransformIdentity;
- // 1.增加65的滚动区域
- UIEdgeInsets inset = _scrollView.contentInset;
- inset.top = _scrollViewInitInset.top + MJRefreshViewHeight;
- _scrollView.contentInset = inset;
- // 2.设置滚动位置
- _scrollView.contentOffset = CGPointMake(0, - _scrollViewInitInset.top - MJRefreshViewHeight);
- }];
- break;
- }
-
- default:
- break;
- }
- }
- #pragma mark - 在父类中用得上
- // 合理的Y值(刚好看到下拉刷新控件时的contentOffset.y,取相反数)
- - (CGFloat)validY
- {
- return _scrollViewInitInset.top;
- }
- // view的类型
- - (int)viewType
- {
- return MJRefreshViewTypeHeader;
- }
- @end
|