美文网首页
MJRefresh源码阅读(三)

MJRefresh源码阅读(三)

作者: 落叶兮兮 | 来源:发表于2020-07-01 15:48 被阅读0次

继上一篇MJRefresh源码阅读(二)之后,这次开始介绍MJRefreshStateHeader,它是继承于MJRefreshHeader的,是带有状态文字的刷新控件。
这个文件中的代码比较简单,但是有一些值得学习的部分,在这里面有两点值得学习。一方面是日期的处理,我们原先在即将进入刷新状态时将时间使用NSUserDefault存储了起来,现在将时间取出,并且需要对时间进行处理,判断上次刷新的时间是今天、今年还是其他年,每个对应的格式有所不同。相应的代码为:

{
        // 1.获得年月日
        NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
        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];
    }

另一方面,是关于iOS开发国际化的问题,上面将时间的格式调整好后,开始进行语言的选择,实现的代码是

self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@%@",
                                          [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText],
                                          isToday ? [NSBundle mj_localizedStringForKey:MJRefreshHeaderDateTodayText] : @"",
                                          time];

作者是写了一个NSBundle的分类,名为NSBundle+MJRefresh,在分类中的相应的实现逻辑为:

+ (NSString *)mj_localizedStringForKey:(NSString *)key
{
    return [self mj_localizedStringForKey:key value:nil];
}

+ (NSString *)mj_localizedStringForKey:(NSString *)key value:(NSString *)value {
    static NSBundle *bundle = nil;
    if (bundle == nil) {
        NSString *language = MJRefreshConfig.defaultConfig.languageCode;
        // 如果配置中没有配置语言
        if (!language) {
            // (iOS获取的语言字符串比较不稳定)目前框架只处理en、zh-Hans、zh-Hant三种情况,其他按照系统默认处理
            language = [NSLocale preferredLanguages].firstObject;
        }
        
        if ([language hasPrefix:@"en"]) {
            language = @"en";
        } else if ([language hasPrefix:@"zh"]) {
            if ([language rangeOfString:@"Hans"].location != NSNotFound) {
                language = @"zh-Hans"; // 简体中文
            } else { // zh-Hant\zh-HK\zh-TW
                language = @"zh-Hant"; // 繁體中文
            }
        } else if ([language hasPrefix:@"ko"]) {
            language = @"ko";
        } else if ([language hasPrefix:@"ru"]) {
            language = @"ru";
        } else if ([language hasPrefix:@"uk"]) {
            language = @"uk";
        } else {
            language = @"en";
        }
        
        // 从MJRefresh.bundle中查找资源
        bundle = [NSBundle bundleWithPath:[[NSBundle mj_refreshBundle] pathForResource:language ofType:@"lproj"]];
    }
    value = [bundle localizedStringForKey:key value:value table:nil];
    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];
}

还有一点值得学习,在placeSubView中设置label的约束,里面判断label的约束是否被设置也值得学习

- (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;
        }
    }
}

相关文章

  • MJRefresh源码阅读3——干货整理

    前言 MJRefresh源码阅读1——结构梳理MJRefresh源码阅读2——核心类MJRefreshHeader...

  • MJRefresh

    MJRefresh原理分析从MJRefresh源码学习上拉下刷新的基本原理MJRefresh源码阅读使用Xtrac...

  • MJRefresh源码阅读(三)

    继上一篇MJRefresh源码阅读(二)之后,这次开始介绍MJRefreshStateHeader,它是继承于MJ...

  • MJRefresh源码阅读(四)

    上一篇[MJRefresh源码阅读(三)](https://www.jianshu.com/p/ad830ae76...

  • MJRefresh 源码阅读

    MJRefresh项目地址 https://github.com/CoderMJLee/MJRefresh下载下来...

  • MJRefresh源码阅读

    可改进部分 在 MJRefreshComponent.h 的 34 行, typedef void (^MJRef...

  • MJRefresh 源码阅读

    1、Runtime1.1 关联对象该框架为UIScrollView添加了两个“成员变量”,header和foote...

  • 阅读MJRefresh源码

    该框架的结构设计得很清晰,使用一个基类MJRefreshComponent来做一些基本的设定,然后通过继承的方式,...

  • 阅读MJRefresh源码

    先看一下源码目录结构: 1.Base MJRefreshComponent:基类(继承至UIView) ``` /...

  • MJRefresh源码阅读

    很多项目的上拉加载下拉刷新功能都是基于MJRefresh来实现的,下面通过源码来分析几个问题。 一、下拉刷新时,M...

网友评论

      本文标题:MJRefresh源码阅读(三)

      本文链接:https://www.haomeiwen.com/subject/eethqktx.html