首页 > 代码库 > iOS开发项目篇—50设置cell的背景

iOS开发项目篇—50设置cell的背景

iOS开发项目篇—50设置cell的背景

一、简单说明

当前样式:

1.去掉分隔线

  

2.设置背景图片(新浪提供了四种图片,底部的图片有阴影)
cell的四种背景图
问题:cell怎么知道自己当前是处在第几组的第几行?
在自定义cell中提供一个方法,共外界传递当前的组和行
YYCommonCell.h文件
 1 // 2 //  YYCommonCell.h 3 // 4  5 #import <Foundation/Foundation.h> 6 @class YYCommonItem; 7 @interface YYCommonCell : UITableViewCell 8  9 //数据10 @property(nonatomic,strong)YYCommonItem *item;11 //类方法,提供cell的初始化12 +(instancetype)cellWithTablView:(UITableView *)tableView;13 14 -(void)setindexPath :(NSIndexPath *)indexPath rowsInSection:(int)row;15 @end
在控制器中传递当前的组和行号
 1 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3     //1.获取cell 4     YYCommonCell *cell=[YYCommonCell cellWithTablView:tableView]; 5     //2.设置cell的显示数据 6     YYCommonGroup *group=self.groups[indexPath.section]; 7     YYCommonItem *item=group.items[indexPath.row]; 8     cell.item=item; 9     [cell setindexPath:indexPath rowsInSection:group.items.count];10     //3.返回cell11     return cell;12 }
YYCommonCell.m文件
 1 // 2 //  YYCommonCell.m 3 // 4  5 #import "YYCommonCell.h" 6 #import "YYCommonItem.h" 7  8 @implementation YYCommonCell 9 //初始化类方法10 +(instancetype)cellWithTablView:(UITableView *)tableView11 {12     static NSString *ID=@"ID";13     YYCommonCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];14     if (cell==nil) {15 //       cell = [[YYCommonCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];16        cell = [[YYCommonCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];17     }18     return cell;19 }20 21 -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier22 {23     self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];24     if (self) {25         //设置标题和子标题的文字26         self.textLabel.font=[UIFont boldSystemFontOfSize:15];27         self.detailTextLabel.font=[UIFont systemFontOfSize:12];28         29         //清除cell的颜色30         self.backgroundColor=[UIColor clearColor];31     }32     return self;33 }34 35 //-(void)setFrame:(CGRect)frame36 //{37 ////    frame.origin.y-=30;38 //    YYLog(@"%f",self.y);39 //    [super setFrame:frame];40 //}41 42 #pragma mark-调整子控件的位置43 -(void)layoutSubviews44 {45     [super layoutSubviews];46     //调整子标题的x值47     self.detailTextLabel.x=CGRectGetMaxX(self.textLabel.frame)+10;48 }49 50 #pragma mark-setter51 -(void)setItem:(YYCommonItem *)item52 {53     _item=item;54     //设置基本数据55     self.imageView.image=[UIImage imageWithName:item.icon];56     self.textLabel.text=item.title;57     self.detailTextLabel.text=item.subtitle;58 }59 60 -(void)setindexPath:(NSIndexPath *)indexPath rowsInSection:(int)rows61 {62    UIImageView *bgv=[[UIImageView alloc]init];63    UIImageView *sgv=[[UIImageView alloc]init];64     65     if (rows==1) {//一组中只有一个cell66         bgv.image=[UIImage imageWithName:@"common_card_background"];67         sgv.image=[UIImage imageWithName:@"common_card_background_highlighted"];68     }else if(indexPath.row==0) //首个cell69     {70         bgv.image=[UIImage imageWithName:@"common_card_top_background"];71         sgv.image=[UIImage imageWithName:@"common_card_top_background_highlighted"];72     }else if(indexPath.row==rows-1)//最后一个cell73     {74         bgv.image=[UIImage imageWithName:@"common_card_bottom_background"];75         sgv.image=[UIImage imageWithName:@"common_card_bottom_background_highlighted"];76     }else//中间的cell77     {78         bgv.image=[UIImage imageWithName:@"common_card_middle_background"];79         sgv.image=[UIImage imageWithName:@"common_card_middle_background_highlighted"];80     }81     self.backgroundView=bgv;82     self.selectedBackgroundView=sgv;83 }84 @end

新的问题:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法调用的频率特别高,没必要每次调用的时候都创建两个imageview。

修改代码:

 1 // 2 //  YYCommonCell.m 3 // 4  5 #import "YYCommonCell.h" 6 #import "YYCommonItem.h" 7  8 @implementation YYCommonCell 9 //初始化类方法10 +(instancetype)cellWithTablView:(UITableView *)tableView11 {12     static NSString *ID=@"ID";13     YYCommonCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];14     if (cell==nil) {15 //       cell = [[YYCommonCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];16        cell = [[YYCommonCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];17     }18     return cell;19 }20 21 -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier22 {23     self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];24     if (self) {25         //设置标题和子标题的文字26         self.textLabel.font=[UIFont boldSystemFontOfSize:15];27         self.detailTextLabel.font=[UIFont systemFontOfSize:12];28         29         //清除cell的颜色30         self.backgroundColor=[UIColor clearColor];31         32         self.backgroundView=[[UIImageView alloc]init];33         self.selectedBackgroundView=[[UIImageView alloc]init];34      35     }36     return self;37 }38 #pragma mark-调整子控件的位置39 -(void)layoutSubviews40 {41     [super layoutSubviews];42     //调整子标题的x值43     self.detailTextLabel.x=CGRectGetMaxX(self.textLabel.frame)+10;44 }45 46 #pragma mark-setter47 -(void)setItem:(YYCommonItem *)item48 {49     _item=item;50     //设置基本数据51     self.imageView.image=[UIImage imageWithName:item.icon];52     self.textLabel.text=item.title;53     self.detailTextLabel.text=item.subtitle;54 }55 56 -(void)setindexPath:(NSIndexPath *)indexPath rowsInSection:(int)rows57 {58     //强制转换,imageview没必要创建多次59     UIImageView *bgv=(UIImageView *)self.backgroundView;60     UIImageView *sgv=(UIImageView *)self.selectedBackgroundView;61     62     if (rows==1) {//一组中只有一个cell63         bgv.image=[UIImage imageWithName:@"common_card_background"];64         sgv.image=[UIImage imageWithName:@"common_card_background_highlighted"];65     }else if(indexPath.row==0) //首个cell66     {67         bgv.image=[UIImage imageWithName:@"common_card_top_background"];68         sgv.image=[UIImage imageWithName:@"common_card_top_background_highlighted"];69     }else if(indexPath.row==rows-1)//最后一个cell70     {71         bgv.image=[UIImage imageWithName:@"common_card_bottom_background"];72         sgv.image=[UIImage imageWithName:@"common_card_bottom_background_highlighted"];73     }else//中间的cell74     {75         bgv.image=[UIImage imageWithName:@"common_card_middle_background"];76         sgv.image=[UIImage imageWithName:@"common_card_middle_background_highlighted"];77     }78   79 }80 @end

界面显示效果:

说明:注意每组最后一个cell的阴影效果。