首页 > 代码库 > iOS开发项目篇—44会员处理

iOS开发项目篇—44会员处理

iOS开发项目篇—44会员处理

一、简单说明

查看已经完成的效果:

存在的问题和调整:

(1)时间和昵称之间的间距较大,调整*0.5。
(2)转发微博的用户昵称和微博正文间距较大,调整(2)。
(3).微博来源设置为亮灰色
打开微博来源,修改之前存在的一个bug.
设置颜色为亮灰色
(4).设置时间字体为橙色。
上面一系列调整完成之后的显示效果为:
 
二、会员设置
1.说明
 微博的用户分为会员和非会员,而根据是否是会员,用户昵称的颜色也不一样,会员显示为橙色,普通用户显示为黑色。
 哪些属性是何用户的“会员”相关的?打印返回的json数据查看。
 1 // 2 //  YYHttpTool.m 3 // 4  5 #import "YYHttpTool.h" 6 #import "AFNetworking.h" 7 @implementation YYHttpTool 8 +(void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure 9 {10     //1.获得请求管理者11     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];12     13     //3.发送Get请求14     [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*responseObj) {15         if (success) {16             success(responseObj);17             YYLog(@"%@",responseObj);18         }19     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {20         if (failure) {21             failure(error);22         }23     }];24 }

json数据(截取了返回的用户信息):

与会员相关的属性:

mbrank:会员等级

nbrank:会员类型
提示:新浪官方文档中并没有列出(上时间未更新),是不是会员取决于类型,当会员类型大于2的时候是会员,0和1不是。
2.实现:给用户模型,增加两个属性,以展示会员等级图标
(1)增加两个属性,一个是否为VIP的方法
 YYUserModel.h文件
 1 // 2 //  YYUserModel.h 3 // 4  5 #import <Foundation/Foundation.h> 6  7 @interface YYUserModel : NSObject 8  9 /**    string    友好显示名称*/10 @property(nonatomic,copy)NSString *name;11 12 /**string    用户头像地址(中图),50×50像素*/13 @property(nonatomic,copy)NSString *profile_image_url;14 15 /**用户的会员等级*/16 @property(nonatomic,assign)int mbrank;17 18 /**用户的会员类型*/19 @property(nonatomic,assign)int mbtype;20 21 /**是否为会员*/22 @property(nonatomic,assign,getter = isVip)BOOL vip;23 24 //接口25 //+(instancetype)userModelWithDict:(NSDictionary *)Dict;26 @end

 YYUserModel.m文件

 1 // 2 //  YYUserModel.m 3 // 4  5 #import "YYUserModel.h" 6  7 @implementation YYUserModel 8 //+(instancetype)userModelWithDict:(NSDictionary *)Dict 9 //{10 //    YYUserModel *model=[[self alloc]init];11 //    model.name=Dict[@"name"];12 //    model.profile_image_url=Dict[@"profile_image_url"];13 //    return model;14 //}15 16 -(BOOL)isVip17 {18     //如果大于2,那么就是会员19     return self.mbtype > 2;20 }21 @end

(2)在原创微博的View上添加会员图标

YYStatusOriginal.m文件

  1 //  2 //  YYStatusOriginal.m  3 //  4   5 #import "YYStatusOriginalView.h"  6 #import "YYStatusOriginalFrame.h"  7 #import "YYUserModel.h"  8 #include "YYStatusModel.h"  9 #import "UIImageView+WebCache.h" 10  11 @interface YYStatusOriginalView () 12 /** 13  *  头像 14  */ 15 @property(nonatomic,weak)UIImageView *iconView; 16 /** 17  *  昵称 18  */ 19 @property(nonatomic,weak)UILabel  *nameLabel; 20 /** 21  *  微博的正文 22  */ 23 @property(nonatomic,weak)UILabel *textLabel; 24 /** 25  *  时间 26  */ 27 @property(nonatomic,weak)UILabel *timeLabel; 28 /** 29  *  来源 30  */ 31 @property(nonatomic,weak)UILabel *sourceLabel; 32 /** 33  *  会员图标 34  */ 35 @property(nonatomic,weak)UIImageView *vipView; 36  37 @end 38 @implementation YYStatusOriginalView 39  40 - (id)initWithFrame:(CGRect)frame 41 { 42     self = [super initWithFrame:frame]; 43     if (self) { 44         //初始化子控件 45         //1.头像 46         UIImageView *iconView=[[UIImageView alloc]init]; 47         [self addSubview:iconView]; 48         self.iconView=iconView; 49          50         //2.昵称 51         UILabel *nameLabel=[[UILabel alloc]init]; 52         nameLabel.font=YYStatusOrginalNameFont; 53         [self addSubview:nameLabel]; 54         self.nameLabel=nameLabel; 55          56         //3.正文 57         UILabel *textLabel=[[UILabel alloc]init]; 58         textLabel.font=YYStatusOrginalTextFont; 59         textLabel.numberOfLines=0; 60         [self addSubview:textLabel]; 61         self.textLabel=textLabel; 62          63         //4.时间 64         UILabel *timeLabel=[[UILabel alloc]init]; 65         timeLabel.font=YYStatusOrginalTimeFont; 66         timeLabel.textColor=[UIColor orangeColor]; 67         [self addSubview:timeLabel]; 68         self.timeLabel=timeLabel; 69          70         //5.来源 71         UILabel *sourceLabel=[[UILabel alloc]init]; 72         sourceLabel.font=YYStatusOrginalSourceFont; 73         sourceLabel.textColor=[UIColor lightGrayColor]; 74         [self addSubview:sourceLabel]; 75         self.sourceLabel=sourceLabel; 76          77         //6.会员图标 78         UIImageView *vipView=[[UIImageView alloc]init]; 79         //会员图标应该设置保持原来的尺寸,垂直居中 80         vipView.contentMode=UIViewContentModeCenter; 81         [self addSubview:vipView]; 82         self.vipView=vipView; 83          84     } 85     return self; 86 } 87  88 -(void)setOriginalFrame:(YYStatusOriginalFrame *)originalFrame 89 { 90     _originalFrame=originalFrame; 91      92     //设置自己的frame 93     self.frame=originalFrame.frame; 94      95     //取出模型数据 96     YYStatusModel *status=originalFrame.status; 97      98     //设置头像的frame 99     [self.iconView setImageWithURL:[NSURL URLWithString:status.user.profile_image_url] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]];100     self.iconView.frame=originalFrame.iconFrame;101     102     //设置昵称的frame103     self.nameLabel.text=status.user.name;104     //注意循环利用的问题105     if (status.user.isVip) {106         self.nameLabel.textColor=[UIColor orangeColor];107         self.vipView.hidden=NO;108         self.vipView.frame=originalFrame.vipViewFrame;109         self.vipView.image=[UIImage imageWithName:[NSString stringWithFormat:@"common_icon_membership_level%d",status.user.mbrank]];110     }else111     {112         self.nameLabel.textColor=[UIColor blackColor];113         self.vipView.hidden=YES;114     }115     self.nameLabel.frame=originalFrame.nameFrame;116     117     //设置正文的frame118     self.textLabel.text=status.text;119     self.textLabel.frame=originalFrame.textFrame;120     121     //设置时间的frame122     self.timeLabel.text=status.created_at;123     self.timeLabel.frame=originalFrame.timeFrame;124     125     //设置来源的frame126     self.sourceLabel.text=status.source;127     self.sourceLabel.frame=originalFrame.sourceFrame;128     129     130 }131 @end

frame模型中的代码设计:

YYStatusOriginalFrame.m文件

 1 // 2 //  YYStatusOriginalFrame.m 3 // 4  5 #import "YYStatusOriginalFrame.h" 6 #import "YYStatusModel.h" 7 #import "YYUserModel.h" 8  9 10 @implementation YYStatusOriginalFrame11 -(void)setStatus:(YYStatusModel *)status12 {13     _status=status;14     //1.计算头像的frame15     CGFloat iconX=YYCellStatusInset;16     CGFloat iconY=YYCellStatusInset;17     CGFloat iconW=35;18     CGFloat iconH=35;19     self.iconFrame=CGRectMake(iconX, iconY, iconW, iconH);20     21     //2.计算昵称的frame22     CGFloat nameX=CGRectGetMaxX(self.iconFrame) + YYCellStatusInset;23     CGFloat nameY=iconY;24     CGSize nameSize=[status.user.name sizeWithFont:YYStatusOrginalNameFont];25     self.nameFrame=(CGRect){{nameX,nameY},nameSize};26     27     //3.计算时间的frame28     CGFloat timeX=nameX;29     CGFloat timeY=CGRectGetMaxY(self.nameFrame)+YYCellStatusInset*0.5;30     CGSize timeSize=[status.created_at sizeWithFont:YYStatusOrginalTimeFont];31     self.timeFrame=(CGRect){{timeX,timeY},timeSize};32     33     //4.计算发布来源的frame34     CGFloat sourcceX=CGRectGetMaxX(self.timeFrame)+YYCellStatusInset;35 //    CGFloat sourcceX=CGRectGetMaxX(self.textFrame)+YYCellStatusInset;36     CGFloat sourcceY=timeY;37     CGSize sourcceSize=[status.source sizeWithFont:YYStatusOrginalSourceFont];38     self.sourceFrame=(CGRect){{sourcceX,sourcceY},sourcceSize};39     40     //5.计算微博正文的frame41 #warning 注意计算的区别42     CGFloat textX=iconX;43     CGFloat textY=CGRectGetMaxY(self.iconFrame)+YYCellStatusInset;44     CGFloat maxW=YYScreenW-2*YYCellStatusInset;45     CGSize maxSize=CGSizeMake(maxW, MAXFLOAT);46     CGSize textSize=[status.text sizeWithFont:YYStatusOrginalTextFont constrainedToSize:maxSize];47     self.textFrame=(CGRect){{textX,textY},textSize};48     49     //6.计算会员图标的frame50     //如果该用户是vip,那么就计算会员图标51     if (status.user.isVip) {52 //        CGFloat vipX=CGRectGetMaxX(self.nameFrame) + YYCellStatusInset;53         CGFloat vipX=CGRectGetMaxX(self.nameFrame) + YYCellStatusInset;54         CGFloat vipY=nameY;55         CGFloat vipH=nameSize.height;56         CGFloat vipW=vipH;57         self.vipViewFrame=CGRectMake(vipX, vipY, vipW, vipH);58     }59     60     //7.计算自己的frame61     CGFloat x=0;62     CGFloat y=0;63     CGFloat w=YYScreenW;64 //    CGFloat h=200;65     CGFloat h=CGRectGetMaxY(self.textFrame)+YYCellStatusInset;66     self.frame=CGRectMake(x, y, w, h);67 }68 @end
注意循环应用问题。
细节:当设置昵称的字体变大时,图标也会跟着居中。会员图标应该设置保持原来的尺寸,垂直居中
 调整后的效果展示: