学习HM微博项目第6天

步骤:首页08-显示微博未读数 -> 首页09-自定义cell -> 首页10-计算cell子控件frame -> 首页11-计算配图的frame -> 首页12-计算转发的frame -> 首页13-工具条

首页08-显示微博未读数

在viewDidLoad方法中,通过设置定时器,每隔一定时间获得微博未读数,并在tabBar上的tabBarItem上显示出来。注意,要处理好UI刷新与数据的关系,保证在UI刷新的同时,从服务器所获得的数据能及时显示出来,如下:

    //获得未读数(时间间隔为60s)
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(setupUnreadCount) userInfo:nil repeats:YES];
    //主线程也会抽时间处理一下timer(不管主线程是否正在处理其他事件)
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

如何从服务器获得微博未读数可见setupUnreadCount:方法,如下:

/**
 *  获得微博未读数
 */
- (void)setupUnreadCount
{
//    HMLog(@"setupUnreadCound");
//    return;
    
    // 1.请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    
    // 2.拼接请求参数
    HMAccount *account = [HMAccountTool account];
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"access_token"] = account.access_token;
    params[@"uid"] = account.uid;

    // 3.发送请求
    [mgr GET:@"https://rm.api.weibo.com/2/remind/unread_count.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
//        HMLog(@"请求成功-%@", responseObject);
        //微博的未读数
//        int status = [responseObject[@"status"] intValue];
        //设置提醒数字
//        self.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d",status];
        
        //description: @10 --> @"10"
        //设置提醒数字(微博的未读数)
        NSString *status = [responseObject[@"status"] description];
        //在ios8中,设置应用的application badge value需要得到用户的许可
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        if ([status isEqualToString:@"0"]) {//如果是0清空
            self.tabBarItem.badgeValue = nil;
            [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

        }else{//非0情况
            self.tabBarItem.badgeValue = status;
            [UIApplication sharedApplication].applicationIconBadgeNumber = status.intValue;

        }
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        HMLog(@"请求失败-%@", error);
    }];

}

说明:
1.每一次微博数据刷新成功后,要清空图标的数字,如下:

清空图标的数字

2.在setupUnreadCount:方法中,除了tabBar上的tabBarItem会显示微博未读数,APP图标上也要显示微博未读数。但是当APP进入后台后,APP会进入后台暂停状态。要使APP后台保持运行状态,必须做些设置。
在AppDelegate的applicationDidEnterBackground:方法,设置后台能长时间运行,如下:

applicationDidEnterBackground:方法

Info.plist文件设置如下:

Info.plist文件设置

APP的界面:

APP的界面

首页09-自定义cell

前文中的tableViewCell是系统自带的,为了让cell能够显示更多的内容并且按照我们的要求来显示,我们需要自定义cell。自定义cell的步骤较为复杂,需要分几步走。自定义cell的步骤可见”iOS总结“。

自定义cell的步骤:

1.创建一个继承自UITableViewCell的HMStatusCell

2.在HMStatusCell.m的initWithStyle:方法中进行子控件的初始化:
1> 将有可能显示的所有子控件都添加到contentView中
2> 顺便设置子控件的一些属性(一次性的设置:字体、⽂字颜色、背景)

3.提供2个模型
1> 一个是数据模型(⽂字数据 + 图片数据) HMStatus
2> 一个是frame模型(数据模型 + 所有子控件的frame + cell的⾼高度) HMStatusFrame

4.cell应该提供⼀个frame模型属性(setStatusFrame:方法)
1> 将frame模型传递给cell
2> cell根据frame模型给子控件设置frame,根据数据模型给⼦控件设置数据
3> cell根据数据模型决定显示和隐藏哪些⼦子控件

5.在tableView的代理方法返回cell的⾼度

HMStatusCell.h

HMStatusCell.m

首页10-计算cell子控件frame

在HMStatusFrame模型中,要包含3个信息:
1.一个数据模型HMStatus
2.一个cell内部所有子控件的frame信息,在HMStatus模型中的set方法中设置
3.一个cell的高度,同样在HMStatus模型中的set方法中设置

setStatus:方法的具体代码:

- (void)setStatus:(HMStatus *)status
{
    _status = status;
    
    //注意:“取出”用户模型
    HMUser *user = status.user;
    
    //计算子控件的frame
    CGFloat cellW = [UIScreen mainScreen].bounds.size.width;
    
    /* 原创微博 */
    /** 头像 */
    CGFloat iconWH = 35;
    CGFloat iconX = HMStatusCellBorderW;
    CGFloat iconY = HMStatusCellBorderW;
    self.iconViewF = CGRectMake(iconX, iconY, iconWH, iconWH);
    
    /** 昵称  注意:要显示需要在cell设置font*/
    CGFloat nameX = CGRectGetMaxX(self.iconViewF) + HMStatusCellBorderW;
    CGFloat nameY = iconY;
    CGSize nameSize = [self sizeWithText:user.name font:HMStatusCellNameLableFont];
    self.nameLabelF = (CGRect){{nameX, nameY},nameSize};
    
    /** 会员图标 */
    if (user.vip) {
        CGFloat vipX = CGRectGetMaxX(self.nameLabelF) + HMStatusCellBorderW;
        CGFloat vipY = nameY;
        CGFloat vipH = nameSize.height;
        CGFloat vipW = 14;
        self.vipViewF = CGRectMake(vipX, vipY, vipW, vipH);
    }
    
    /** 时间 */
    CGFloat timeX = nameX;
    CGFloat timeY = CGRectGetMaxY(self.nameLabelF) + HMStatusCellBorderW;
    CGSize timeSize = [self sizeWithText:status.created_at font:HMStatusCellTimeLableFont];
    self.timeLabelF = (CGRect){{timeX, timeY},timeSize};
    
    /** 来源 */
    CGFloat sourceX = CGRectGetMaxX(self.timeLabelF) + HMStatusCellBorderW;
    CGFloat sourceY = timeY;
    CGSize sourceSize = [self sizeWithText:status.source font:HMStatusCellSourceLableFont];
    self.sourceLabelF = (CGRect){{sourceX, sourceY},sourceSize};
    
    /** 正文 */
    CGFloat contentX = iconX;
    CGFloat contentY = MAX(CGRectGetMaxY(self.iconViewF), CGRectGetMaxY(self.timeLabelF)) + HMStatusCellBorderW;
    CGFloat maxW = cellW - 2 * HMStatusCellBorderW;
    CGSize contentSize = [self sizeWithText:status.text font:HMStatusCellContentLableFont maxW:maxW];
    self.contentLabelF = (CGRect){{contentX, contentY},contentSize};
    
    /** 配图 */

    /** 原创微博整体 */
    CGFloat originalX = 0;
    CGFloat originalY = 0;
    CGFloat originalH = CGRectGetMaxY(self.contentLabelF) + HMStatusCellBorderW;
    CGFloat originalW = cellW ;
    self.originalViewF = CGRectMake(originalX, originalY, originalW, originalH);
    
    /** cell的高度 */
    self.cellHeight = CGRectGetMaxY(self.originalViewF);

}

其中,size的计算方法如下:

size的计算方法

首页11-计算配图的frame

从服务器所获得的配图信息存放在HMStatus模型的属性pic_urls(数组类型)中,为了让系统能够知道其所存放的是HMPhoto类,需要:

HMStatus.m

注意:为了确保HMStatus模型能够存放从服务器得到的数据,要保证属性名称与服务器的保持一致。

首页12-计算转发的frame

在前文的基础上,继续完善自定义cell,在HMStatusCell类中添加子控件,根据HMStatus模型和HMStatusFrame模型分别给cell设置数据和frame。
注意:要将所有子控件的frame计算都放在HMStatusFrame模型中。而HMStatus模型存放的是我们从服务器所获得的信息。

首页13-工具条

在HMStatusCell的initWithStyle:方法中初始化工具条,如下:

initWithStyle:方法

该工具条HMStatusToolBar继承自UIView,在initWithFrame:方法初始化所有子控件,但是要在layoutSubViews方法中设置子控件的位置和尺寸。另外,该工具条还要有一个HMStatus模型,用来获取转发、评论等信息,显示在工具条的按钮上。

APP的界面:


APP的界面

总结

这一天主要是自定义cell,在HMStatusCell类中添加子控件,并根据HMStatus模型和HMStatusFrame模型分别给cell设置数据和frame。
注意:
1.在HMStatus模型存放从服务器所获得的信息
2.在HMStatusFrame模型中计算所有子控件的frame

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容