New file |
| | |
| | | // |
| | | // MJRefreshStateHeader.m |
| | | // MJRefreshExample |
| | | // |
| | | // Created by MJ Lee on 15/4/24. |
| | | // Copyright (c) 2015年 小码哥. All rights reserved. |
| | | // |
| | | |
| | | #import "MJRefreshStateHeader.h" |
| | | |
| | | @interface MJRefreshStateHeader() |
| | | { |
| | | /** 显示上一次刷新时间的label */ |
| | | __unsafe_unretained UILabel *_lastUpdatedTimeLabel; |
| | | /** 显示刷新状态的label */ |
| | | __unsafe_unretained UILabel *_stateLabel; |
| | | } |
| | | /** 所有状态对应的文字 */ |
| | | @property (strong, nonatomic) NSMutableDictionary *stateTitles; |
| | | @end |
| | | |
| | | @implementation MJRefreshStateHeader |
| | | #pragma mark - 懒加载 |
| | | - (NSMutableDictionary *)stateTitles |
| | | { |
| | | if (!_stateTitles) { |
| | | self.stateTitles = [NSMutableDictionary dictionary]; |
| | | } |
| | | return _stateTitles; |
| | | } |
| | | |
| | | - (UILabel *)stateLabel |
| | | { |
| | | if (!_stateLabel) { |
| | | [self addSubview:_stateLabel = [UILabel mj_label]]; |
| | | } |
| | | return _stateLabel; |
| | | } |
| | | |
| | | - (UILabel *)lastUpdatedTimeLabel |
| | | { |
| | | if (!_lastUpdatedTimeLabel) { |
| | | [self addSubview:_lastUpdatedTimeLabel = [UILabel mj_label]]; |
| | | } |
| | | return _lastUpdatedTimeLabel; |
| | | } |
| | | |
| | | #pragma mark - 公共方法 |
| | | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state |
| | | { |
| | | if (title == nil) return; |
| | | self.stateTitles[@(state)] = title; |
| | | self.stateLabel.text = self.stateTitles[@(self.state)]; |
| | | } |
| | | |
| | | #pragma mark - 日历获取在9.x之后的系统使用currentCalendar会出异常。在8.0之后使用系统新API。 |
| | | - (NSCalendar *)currentCalendar { |
| | | if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) { |
| | | return [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; |
| | | } |
| | | return [NSCalendar currentCalendar]; |
| | | } |
| | | |
| | | #pragma mark key的处理 |
| | | - (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey |
| | | { |
| | | [super setLastUpdatedTimeKey:lastUpdatedTimeKey]; |
| | | |
| | | // 如果label隐藏了,就不用再处理 |
| | | if (self.lastUpdatedTimeLabel.hidden) return; |
| | | |
| | | NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey]; |
| | | |
| | | // 如果有block |
| | | if (self.lastUpdatedTimeText) { |
| | | self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime); |
| | | return; |
| | | } |
| | | |
| | | if (lastUpdatedTime) { |
| | | // 1.获得年月日 |
| | | NSCalendar *calendar = [self currentCalendar]; |
| | | NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute; |
| | | NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime]; |
| | | NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; |
| | | |
| | | // 2.格式化日期 |
| | | NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; |
| | | BOOL isToday = NO; |
| | | if ([cmp1 day] == [cmp2 day]) { // 今天 |
| | | formatter.dateFormat = @" HH:mm"; |
| | | isToday = YES; |
| | | } else if ([cmp1 year] == [cmp2 year]) { // 今年 |
| | | formatter.dateFormat = @"MM-dd HH:mm"; |
| | | } else { |
| | | formatter.dateFormat = @"yyyy-MM-dd HH:mm"; |
| | | } |
| | | NSString *time = [formatter stringFromDate:lastUpdatedTime]; |
| | | |
| | | // 3.显示日期 |
| | | self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@%@", |
| | | [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText], |
| | | isToday ? [NSBundle mj_localizedStringForKey:MJRefreshHeaderDateTodayText] : @"", |
| | | time]; |
| | | } else { |
| | | self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@", |
| | | [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText], |
| | | [NSBundle mj_localizedStringForKey:MJRefreshHeaderNoneLastDateText]]; |
| | | } |
| | | } |
| | | |
| | | #pragma mark - 覆盖父类的方法 |
| | | - (void)prepare |
| | | { |
| | | [super prepare]; |
| | | |
| | | // 初始化间距 |
| | | self.labelLeftInset = MJRefreshLabelLeftInset; |
| | | |
| | | // 初始化文字 |
| | | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderIdleText] forState:MJRefreshStateIdle]; |
| | | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderPullingText] forState:MJRefreshStatePulling]; |
| | | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderRefreshingText] forState:MJRefreshStateRefreshing]; |
| | | } |
| | | |
| | | - (void)placeSubviews |
| | | { |
| | | [super placeSubviews]; |
| | | |
| | | if (self.stateLabel.hidden) return; |
| | | |
| | | BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0; |
| | | |
| | | if (self.lastUpdatedTimeLabel.hidden) { |
| | | // 状态 |
| | | if (noConstrainsOnStatusLabel) self.stateLabel.frame = self.bounds; |
| | | } else { |
| | | CGFloat stateLabelH = self.mj_h * 0.5; |
| | | // 状态 |
| | | if (noConstrainsOnStatusLabel) { |
| | | self.stateLabel.mj_x = 0; |
| | | self.stateLabel.mj_y = 0; |
| | | self.stateLabel.mj_w = self.mj_w; |
| | | self.stateLabel.mj_h = stateLabelH; |
| | | } |
| | | |
| | | // 更新时间 |
| | | if (self.lastUpdatedTimeLabel.constraints.count == 0) { |
| | | self.lastUpdatedTimeLabel.mj_x = 0; |
| | | self.lastUpdatedTimeLabel.mj_y = stateLabelH; |
| | | self.lastUpdatedTimeLabel.mj_w = self.mj_w; |
| | | self.lastUpdatedTimeLabel.mj_h = self.mj_h - self.lastUpdatedTimeLabel.mj_y; |
| | | } |
| | | } |
| | | } |
| | | |
| | | - (void)setState:(MJRefreshState)state |
| | | { |
| | | MJRefreshCheckState |
| | | |
| | | // 设置状态文字 |
| | | self.stateLabel.text = self.stateTitles[@(state)]; |
| | | |
| | | // 重新设置key(重新显示时间) |
| | | self.lastUpdatedTimeKey = self.lastUpdatedTimeKey; |
| | | } |
| | | @end |