您的位置:1010cc时时彩经典版 > 操作系统 > 1010cc时时彩经典版UITableView的归纳利用,纯代码完

1010cc时时彩经典版UITableView的归纳利用,纯代码完

发布时间:2019-08-11 15:49编辑:操作系统浏览(137)

    ios开荒UI篇—使用纯代码自定义UItableviewcell完毕多少个简约的今日头条分界面布局,iosuitableviewcell

     

    正文转自 :

     

    ios开垦UI篇—使用纯代码自定义UItableviewcell实现一个总结的新浪分界面布局

    一、完成效果与利益

    1010cc时时彩经典版 1

     

    二、使用纯代码自定义二个tableview的手续

    1.新建叁个承继自UITableViewCell的类

    2.重写initWithStyle:reuseIdentifier:方法

    拉长全体必要显示的子控件(无需设置子控件的数码和frame,  子控件要增加到contentView中)

    实行子控件三回性的性质设置(有个别属性只要求设置叁遍, 比如字体一定的图形)

    3.提供2个模型

    数据模型: 寄放文字数据图表数据

    frame模型: 存放数据模型全部子控件的framecell的高度

    4.cell独具贰个frame模型(不要一贯持有数据模型)

    5.重写frame模型属性的setter方法: 在那些主意中设置子控件的显得数据和frame 

    6.frame模型数据的初阶化已经使用懒加载的点子(每三个cell对应的frame模型数据只加载一回)

    三、文件结谈判促成代码

    1.文件结构

    1010cc时时彩经典版 2

     

    2.落到实处代码:

    NJWeibo.h文件

    1010cc时时彩经典版 3

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface NJWeibo : NSObject
     4 @property (nonatomic, copy) NSString *text; // 内容
     5 @property (nonatomic, copy) NSString *icon; // 头像
     6 @property (nonatomic, copy) NSString *name; // 昵称
     7 @property (nonatomic, copy) NSString *picture; // 配图
     8 @property (nonatomic, assign) BOOL vip;
     9 
    10 - (id)initWithDict:(NSDictionary *)dict;
    11   (id)weiboWithDict:(NSDictionary *)dict;
    12 @end
    

    1010cc时时彩经典版 4

    NJWeibo.m文件

    1010cc时时彩经典版 5

     1 #import "NJWeibo.h"
     2 
     3 @implementation NJWeibo
     4 
     5 - (id)initWithDict:(NSDictionary *)dict
     6 {
     7     if (self = [super init]) {
     8         [self setValuesForKeysWithDictionary:dict];
     9     }
    10     return self;
    11 }
    12 
    13   (id)weiboWithDict:(NSDictionary *)dict
    14 {
    15     return [[self alloc] initWithDict:dict];
    16 }
    17 
    18 @end
    

    1010cc时时彩经典版 6

    NJWeiboCell.h文件

    1010cc时时彩经典版 7

     1 #import <UIKit/UIKit.h>
     2 @class NJWeiboFrame;
     3 
     4 @interface NJWeiboCell : UITableViewCell
     5 /**
     6  *  接收外界传入的模型
     7  */
     8 //@property (nonatomic, strong) NJWeibo *weibo;
     9 
    10 @property (nonatomic, strong) NJWeiboFrame *weiboFrame;
    11 
    12   (instancetype)cellWithTableView:(UITableView *)tableView;
    13 @end
    

    1010cc时时彩经典版 8

    NJWeiboCell.m文件

    1010cc时时彩经典版 9

      1 #import "NJWeiboCell.h"
      2 #import "NJWeibo.h"
      3 #import "NJWeiboFrame.h"
      4 
      5 #define NJNameFont [UIFont systemFontOfSize:15]
      6 #define NJTextFont [UIFont systemFontOfSize:16]
      7 
      8 @interface NJWeiboCell ()
      9 /**
     10  *  头像
     11  */
     12 @property (nonatomic, weak) UIImageView *iconView;
     13 /**
     14  *  vip
     15  */
     16 @property (nonatomic, weak) UIImageView *vipView;
     17 /**
     18  *  配图
     19  */
     20 @property (nonatomic, weak) UIImageView *pictureView;
     21 /**
     22  *  昵称
     23  */
     24 @property (nonatomic, weak) UILabel *nameLabel;
     25 /**
     26  *  正文
     27  */
     28 @property (nonatomic, weak) UILabel *introLabel;
     29 @end
     30 
     31 @implementation NJWeiboCell
     32 
     33   (instancetype)cellWithTableView:(UITableView *)tableView
     34 {
     35     // NSLog(@"cellForRowAtIndexPath");
     36     static NSString *identifier = @"status";
     37     // 1.缓存中取
     38     NJWeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     39     // 2.创建
     40     if (cell == nil) {
     41         cell = [[NJWeiboCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
     42     }
     43     return cell;
     44 }
     45 
     46 
     47 /**
     48  *  构造方法(在初始化对象的时候会调用)
     49  *  一般在这个方法中添加需要显示的子控件
     50  */
     51 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
     52 {
     53     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
     54     if (self) {
     55         // 让自定义Cell和系统的cell一样, 一创建出来就拥有一些子控件提供给我们使用
     56         // 1.创建头像
     57         UIImageView *iconView = [[UIImageView alloc] init];
     58         [self.contentView addSubview:iconView];
     59         self.iconView = iconView;
     60         
     61         // 2.创建昵称
     62         UILabel *nameLabel = [[UILabel alloc] init];
     63         nameLabel.font = NJNameFont;
     64         // nameLabel.backgroundColor = [UIColor redColor];
     65         [self.contentView addSubview:nameLabel];
     66         self.nameLabel = nameLabel;
     67         
     68         // 3.创建vip
     69         UIImageView *vipView = [[UIImageView alloc] init];
     70         vipView.image = [UIImage imageNamed:@"vip"];
     71         [self.contentView addSubview:vipView];
     72         self.vipView = vipView;
     73         
     74         // 4.创建正文
     75         UILabel *introLabel = [[UILabel alloc] init];
     76         introLabel.font = NJTextFont;
     77         introLabel.numberOfLines = 0;
     78         // introLabel.backgroundColor = [UIColor greenColor];
     79         [self.contentView addSubview:introLabel];
     80         self.introLabel = introLabel;
     81         
     82         // 5.创建配图
     83         UIImageView *pictureView = [[UIImageView alloc] init];
     84         [self.contentView addSubview:pictureView];
     85         self.pictureView = pictureView;
     86         
     87     }
     88     return self;
     89 }
     90 
     91 
     92 - (void)setWeiboFrame:(NJWeiboFrame *)weiboFrame
     93 {
     94     _weiboFrame = weiboFrame;
     95     
     96     // 1.给子控件赋值数据
     97     [self settingData];
     98     // 2.设置frame
     99     [self settingFrame];
    100 }
    101 
    102 
    103 /**
    104  *  设置子控件的数据
    105  */
    106 - (void)settingData
    107 {
    108     NJWeibo *weibo = self.weiboFrame.weibo;
    109     
    110     // 设置头像
    111     self.iconView.image = [UIImage imageNamed:weibo.icon];
    112     // 设置昵称
    113     self.nameLabel.text = weibo.name;
    114     // 设置vip
    115     if (weibo.vip) {
    116         self.vipView.hidden = NO;
    117         self.nameLabel.textColor = [UIColor redColor];
    118     }else
    119     {
    120         self.vipView.hidden = YES;
    121         self.nameLabel.textColor = [UIColor blackColor];
    122     }
    123     // 设置内容
    124     self.introLabel.text = weibo.text;
    125     
    126     // 设置配图
    127     if (weibo.picture) {// 有配图
    128         self.pictureView.image = [UIImage imageNamed:weibo.picture];
    129         self.pictureView.hidden = NO;
    130     }else
    131     {
    132         self.pictureView.hidden = YES;
    133     }
    134 }
    135 /**
    136  *  设置子控件的frame
    137  */
    138 - (void)settingFrame
    139 {
    140 
    141        // 设置头像的frame
    142     self.iconView.frame = self.weiboFrame.iconF;
    143     
    144     // 设置昵称的frame
    145         self.nameLabel.frame = self.weiboFrame.nameF;
    146     
    147     // 设置vip的frame
    148        self.vipView.frame = self.weiboFrame.vipF;
    149     
    150     // 设置正文的frame
    151        self.introLabel.frame = self.weiboFrame.introF;
    152     
    153     // 设置配图的frame
    154 
    155     if (self.weiboFrame.weibo.picture) {// 有配图
    156         self.pictureView.frame = self.weiboFrame.pictrueF;
    157     }
    158 }
    159 
    160 /**
    161  *  计算文本的宽高
    162  *
    163  *  @param str     需要计算的文本
    164  *  @param font    文本显示的字体
    165  *  @param maxSize 文本显示的范围
    166  *
    167  *  @return 文本占用的真实宽高
    168  */
    169 - (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize
    170 {
    171     NSDictionary *dict = @{NSFontAttributeName : font};
    172     // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围
    173     // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围
    174     CGSize size =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
    175     return size;
    176 }
    177 
    178 @end
    

    1010cc时时彩经典版 10

    NJWeiboFrame.h文件

    1010cc时时彩经典版 11

     1 //  专门用来保存每一行数据的frame, 计算frame
     2 
     3 #import <Foundation/Foundation.h>
     4 @class NJWeibo;
     5 @interface NJWeiboFrame : NSObject
     6 /**
     7  *  头像的frame
     8  */
     9 @property (nonatomic, assign) CGRect iconF;
    10 /**
    11  *  昵称的frame
    12  */
    13 @property (nonatomic, assign) CGRect nameF;
    14 /**
    15  *  vip的frame
    16  */
    17 @property (nonatomic, assign) CGRect vipF;
    18 /**
    19  *  正文的frame
    20  */
    21 @property (nonatomic, assign) CGRect introF;
    22 /**
    23  *  配图的frame
    24  */
    25 @property (nonatomic, assign) CGRect pictrueF;
    26 /**
    27  *  行高
    28  */
    29 @property (nonatomic, assign) CGFloat cellHeight;
    30 
    31 /**
    32  *  模型数据
    33  */
    34 @property (nonatomic, strong) NJWeibo *weibo;
    35 @end
    

    1010cc时时彩经典版 12

    NJWeiboFrame.m文件

    1010cc时时彩经典版 13

     1 #import "NJWeiboFrame.h"
     2 #import "NJWeibo.h"
     3 #define NJNameFont [UIFont systemFontOfSize:15]
     4 #define NJTextFont [UIFont systemFontOfSize:16]
     5 
     6 
     7 @implementation NJWeiboFrame
     8 
     9 
    10 - (void)setWeibo:(NJWeibo *)weibo
    11 {
    12     _weibo = weibo;
    13     
    14     // 间隙
    15     CGFloat padding = 10;
    16     
    17     // 设置头像的frame
    18     CGFloat iconViewX = padding;
    19     CGFloat iconViewY = padding;
    20     CGFloat iconViewW = 30;
    21     CGFloat iconViewH = 30;
    22     self.iconF = CGRectMake(iconViewX, iconViewY, iconViewW, iconViewH);
    23     
    24     // 设置昵称的frame
    25     // 昵称的x = 头像最大的x   间隙
    26     CGFloat nameLabelX = CGRectGetMaxX(self.iconF)   padding;
    27     // 计算文字的宽高
    28     CGSize nameSize = [self sizeWithString:_weibo.name font:NJNameFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
    29     
    30     CGFloat nameLabelH = nameSize.height;
    31     CGFloat nameLabelW = nameSize.width;
    32     CGFloat nameLabelY = iconViewY   (iconViewH - nameLabelH) * 0.5;
    33    self.nameF = CGRectMake(nameLabelX, nameLabelY, nameLabelW, nameLabelH);
    34     
    35     // 设置vip的frame
    36     CGFloat vipViewX = CGRectGetMaxX(self.nameF)   padding;
    37     CGFloat vipViewY = nameLabelY;
    38     CGFloat vipViewW = 14;
    39     CGFloat vipViewH = 14;
    40     self.vipF = CGRectMake(vipViewX, vipViewY, vipViewW, vipViewH);
    41     
    42     // 设置正文的frame
    43     CGFloat introLabelX = iconViewX;
    44     CGFloat introLabelY = CGRectGetMaxY(self.iconF)   padding;
    45     CGSize textSize =  [self sizeWithString:_weibo.text font:NJTextFont maxSize:CGSizeMake(300, MAXFLOAT)];
    46     
    47     CGFloat introLabelW = textSize.width;
    48     CGFloat introLabelH = textSize.height;
    49     
    50     self.introF = CGRectMake(introLabelX, introLabelY, introLabelW, introLabelH);
    51     
    52     // 设置配图的frame
    53     CGFloat cellHeight = 0;
    54     if (_weibo.picture) {// 有配图
    55         CGFloat pictureViewX = iconViewX;
    56         CGFloat pictureViewY = CGRectGetMaxY(self.introF)   padding;
    57         CGFloat pictureViewW = 100;
    58         CGFloat pictureViewH = 100;
    59         self.pictrueF = CGRectMake(pictureViewX, pictureViewY, pictureViewW, pictureViewH);
    60         
    61         // 计算行高
    62         self.cellHeight = CGRectGetMaxY(self.pictrueF)   padding;
    63     }else
    64     {
    65         // 没有配图情况下的行高
    66         self.cellHeight = CGRectGetMaxY(self.introF)   padding;
    67     }
    68     
    69 }
    70 
    71 /**
    72  *  计算文本的宽高
    73  *
    74  *  @param str     需要计算的文本
    75  *  @param font    文本显示的字体
    76  *  @param maxSize 文本显示的范围
    77  *
    78  *  @return 文本占用的真实宽高
    79  */
    80 - (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize
    81 {
    82     NSDictionary *dict = @{NSFontAttributeName : font};
    83     // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围
    84     // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围
    85     CGSize size =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
    86     return size;
    87 }
    88 @end
    

    1010cc时时彩经典版 14

    主要调整制器

    NJViewController.m文件

    1010cc时时彩经典版 15

     1 #import "NJViewController.h"
     2 #import "NJWeibo.h"
     3 #import "NJWeiboCell.h"
     4 #import "NJWeiboFrame.h"
     5 
     6 @interface NJViewController ()
     7 @property (nonatomic, strong) NSArray *statusFrames;
     8 @end
     9 
    10 @implementation NJViewController
    11 
    12 #pragma mark - 数据源方法
    13 
    14 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    15 {
    16     return self.statusFrames.count;
    17 }
    18 
    19 
    20 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    21 {
    22     NJWeiboCell *cell = [NJWeiboCell cellWithTableView:tableView];
    23     // 3.设置数据
    24    cell.weiboFrame = self.statusFrames[indexPath.row];
    25     
    26     // 4.返回
    27     return cell;
    28 }
    29 #pragma mark - 懒加载
    30 - (NSArray *)statusFrames
    31 {
    32     if (_statusFrames == nil) {
    33         NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil];
    34         NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];
    35         NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];
    36         for (NSDictionary *dict in dictArray) {
    37             // 创建模型
    38             NJWeibo *weibo = [NJWeibo weiboWithDict:dict];
    39             // 根据模型数据创建frame模型
    40             NJWeiboFrame *wbF = [[NJWeiboFrame alloc] init];
    41             wbF.weibo = weibo;
    42             
    43             [models addObject:wbF];
    44         }
    45         self.statusFrames = [models copy];
    46     }
    47     return _statusFrames;
    48 }
    49 
    50 #pragma mark - 代理方法
    51 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    52 {
    53     // NSLog(@"heightForRowAtIndexPath");
    54     // 取出对应航的frame模型
    55     NJWeiboFrame *wbF = self.statusFrames[indexPath.row];
    56     NSLog(@"height = %f", wbF.cellHeight);
    57     return wbF.cellHeight;
    58 }
    59 
    60 - (BOOL) prefersStatusBarHidden
    61 {
    62     return YES;
    63 }
    64 @end
    

    1010cc时时彩经典版 16

    四、补充表达

    鉴于系统提供的tableview也许并不可能知足大家的付出须要,所以有时须要咱们能够自定义tableview。

    自定义tableview有两种艺术,一种是利用xib成立,一种是利用纯代码的法子开创。

    对此样式一样的tableview,日常使用xib实行创办,对于高度不一样,内容也不完全一致的一般采用纯代码举行自定义。

    本文转自 :...

     

     

    这种方法已被淘汰。推荐使用AutoLayout,轻便粗暴。这里有个总结,写的很好。

    一、UITableview的采纳手续****

    本文转自 :

    本文转自 :

    1. 介绍
      近期正在做三个AppDemo,当中使用了评价效能,作者绸缪用UITableView做,不过须求自定义cell的可观,总不能够让用户就发固定行数的褒贬啊,更毫不说还要上传图片了。所以我就上网查了下资料,做了那般贰个德姆o。那是功力图。

      1010cc时时彩经典版 17

      效果图

    UITableview的选用就独有轻巧的四个步骤:
    1.告诉一共有多少组数据
    方法:- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    2.告诉每组一共有微微行
    方法:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    3.设置每组每行(cell)
    方法:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    二、使用表达

     

     

    我是参照着文顶顶大神的博客做的,这是链接。大神写的有些地方和我的有些出入,我就重新整理一下,加上了一些注释和自己的理解。
    

    1.不怎么组数据和出示多少行常常是和数量有关的,在支付中数量一般存款和储蓄在plist文件中,需求以一定的主意加载到品种中(模型)。
    2.装置每组每行,说简练点正是设置tableview中得每一种cell.
    安装cell的步子有三步:
    (1)创立三个cell(需求思虑品质,对cell实行巡回使用,注意缓存处理情势)
    (2)为cell设置数据
    (3)重返二个cell
    安装cell有三种办法:
    (1)使用系统提供的tableviewcell举办设置
    (2)通过xib自定义tableviewcell,适用于长相平等的,如团购浮现分界面
    (3)通过纯代码自定义tableviewcell,适用于有出入的,如表现为高度不一致,有的cell拥有有些属性,而部分cell中并未有,近来日头条展现分界面
    三、自定义tableviewcell
    1.通过xib文件自定义四个view的步骤
    (1)新建二个xib文件,描述五个view的内部
    (2)新建一个自定义的类,自定义的类须要后续自系统自带的view,承继自哪个类,取决于xib跟对象的class
    (3)新建类的类型最佳跟xib的文件名保持一致
    (4)将xib的控件和自定义类的.m文件实行连线
    (5)提供一个类的方法重返三个创设好的自定iview(屏蔽从xib加载的长河)
    (6)提供三个模子属性让外部传递模型数据
    (7)重写模型属性的setter方法,在这里讲模型数据显示到相应的子控件上边
    2.通过代码格局自定义cell
    (1)新建⼀二个接续自UITableViewCell的类
    (2)重写initWithStyle:reuseIdentifier:方法
    累加全体必要呈现的子控件(没有必要设置子控件的数据和frame, 子控件要增添到contentView中)
    对子控件举行一遍性的属性设置(某个属性只须求设置二回, 举例字体恒定的图样)
    (3)提供2个模型
    数据模型: 存放文字数据图片数据
    frame模型: 寄放数据模型全部子控件的framecell的高度
    (4)cell具备八个frame模型(不要平素持有数据模型)
    (5)重写frame模型属性的setter方法: 在那个点子中设置子控件的浮现数据和frame
    (6)frame模型数据的起初化已经选拔懒加载的艺术(每贰个cell对应的frame模型数据只加载一遍)

    ios开垦UI篇—使用纯代码自定义UItableviewcell达成三个简易的搜狐分界面布局

    ios开辟UI篇—使用纯代码自定义UItableviewcell完成四个回顾的今日头条分界面布局

    1. 着力步骤(大神写的,对笔者来说,刚看的时候三头雾水,写了一次代码才稍稍掌握了)
      1. 新建三个持续自UITableViewCell的类
      2. 重写initWithStyle:reuseIdentifier:方法增多全部要求出示的子控件(没有供给设置子控件的数目和frame, 子控件要增添到contentView中)进行子控件贰回性的习性设置(有个别属性只要求设置壹次, 比方字体牢固的图样)
      3. 提供2个模型:
        • 数据模型: 寄放文字数据图表数据
        • frame模型: 存放数据模型全数子控件的framecell的高度
      4. cell具备一个frame模型(不要直接持有数据模型)
      5. 重写frame模型属性的setter方法: 在这几个措施中设置子控件的来得数据和frame
      6. frame模型数据的初步化已经应用懒加载的章程(每贰个cell对应的frame模型数据只加载一回)
    2. 文件结构

    四、使用代理的步子
    (1)先搞理解哪个人是何人的代理(delegate)

    一、完成效果与利益

    一、实现效果与利益

    ![](https://upload-images.jianshu.io/upload_images/1324525-18caf6ca4b7296c5.png)
    
    文件结构图
    
    
    
    这里需要多加注意这个plist文件。
    

    (2)定义代理协议,协议名称的命名规范:控件类名 Delegate
    (3)定义代理方法
    代办方法一般都定义为@optional
    代办方法名都是控件名初阶
    代理方法至少有1个参数,将控件本人传递出去
    (4)设置代理(delegate)对象 (⽐举个例子myView.delegate = xxxx;)
    代理对象遵循协议
    代理对象达成协议里面该兑现的章程

    1010cc时时彩经典版 18

    1010cc时时彩经典版 19

    1. 代码示例:
      环境:Xcode7.1

      1. Weibo.h
        #import <Foundation/Foundation.h>

        @interface Weibo : NSObject
        
        @property (nonatomic, copy) NSString *text;         // 内容
        @property (nonatomic, copy) NSString *icon;         // 头像图片名称
        @property (nonatomic, copy) NSString *name;         // 昵称图片名称
        @property (nonatomic, copy) NSString *picture;      // 配图图片名称
        @property (nonatomic, assign) BOOL vip;             // 判断用户是不是Vip
        
        -(id)initWithDict:(NSDictionary *)dict;
         (id)weiboWithDict:(NSDictionary *)dict;
        
        @end
        
      2. Weibo.m
        //
        // Weibo.m
        // 类天涯论坛正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import "Weibo.h"
        
        @implementation Weibo
        
        //为属性设置值
        -(id)initWithDict:(NSDictionary *)dict{
            if (self=[super init]) {
                [self setValuesForKeysWithDictionary:dict];
            }
            return self;
        }
        /*  对上面的讲解:
         *  setValuesForKeysWithDictionary:方法,
         *  会为我们把和dict中的key名字相同的class proerty设置上dict中与key对应的value
         *  链接处有对该方面的相关讲解http://www.cocoachina.com/industry/20140224/7866.html
         */
        
         (id)weiboWithDict:(NSDictionary *)dict{
            return [[self alloc]initWithDict:dict];
        }
        
        @end
        
      3. WeiboFrame.h
        //
        // WeiboFrame.h
        // 类博客园正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import <Foundation/Foundation.h>
        #import <UIKit/UIKit.h>
        
        @class Weibo;
        
        @interface WeiboFrame : NSObject
        
        /*
         *  数据模型提供所需要的子控件的内容,数据;frame模型计算,保存每个子控件的frame和cell行高
         */
        
        /*
         *  1.数据模型
         */
        
        @property (nonatomic, strong) Weibo *weibo;
        
        /*
         *  2.frame模型
         */
        
        //头像的frame
        @property (nonatomic, assign) CGRect iconF;
        //昵称的frame
        @property (nonatomic, assign) CGRect nameF;
        //vip的frame
        @property (nonatomic, assign) CGRect vipF;
        //正文的frame
        @property (nonatomic, assign) CGRect introF;
        //配图的frame
        @property (nonatomic, assign) CGRect pictrueF;
        //行高
        @property (nonatomic, assign) CGFloat cellHeight;
        
        @end
        
      4. WeiboFrame.m
        //
        // WeiboFrame.m
        // 类新浪正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import "WeiboFrame.h"
        #import "Weibo.h"
        
        #define NameFont [UIFont systemFontOfSize:15]
        #define TextFont [UIFont systemFontOfSize:16]
        
        @implementation WeiboFrame
        
        - (void)setWeibo:(Weibo *)weibo
        {
            _weibo = weibo;
        
            // 间隙
            CGFloat padding = 10;
        
            // 1.设置头像的frame
            CGFloat iconViewX = padding;
            CGFloat iconViewY = padding;
            CGFloat iconViewW = 30;
            CGFloat iconViewH = 30;
            self.iconF = CGRectMake(iconViewX, iconViewY, iconViewW, iconViewH);
        
            // 2.设置昵称的frame
            // 昵称的x = 头像最大的x   间隙
            CGFloat nameLabelX = CGRectGetMaxX(self.iconF)   padding;
            // 计算文字的宽高
            CGSize nameSize = [self sizeWithString:_weibo.name font:NameFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
        
            CGFloat nameLabelH = nameSize.height;
            CGFloat nameLabelW = nameSize.width;
            CGFloat nameLabelY = iconViewY   (iconViewH - nameLabelH) * 0.5;
            self.nameF = CGRectMake(nameLabelX, nameLabelY, nameLabelW, nameLabelH);
        
            // 3.设置vip的frame
            CGFloat vipViewX = CGRectGetMaxX(self.nameF)   padding;
            CGFloat vipViewY = nameLabelY;
            CGFloat vipViewW = 14;
            CGFloat vipViewH = 14;
            self.vipF = CGRectMake(vipViewX, vipViewY, vipViewW, vipViewH);
        
            // 4.设置正文的frame
            CGFloat introLabelX = iconViewX;
            CGFloat introLabelY = CGRectGetMaxY(self.iconF)   padding;
            CGSize textSize =  [self sizeWithString:_weibo.text font:TextFont maxSize:CGSizeMake(300, MAXFLOAT)];
        
            CGFloat introLabelW = textSize.width;
            CGFloat introLabelH = textSize.height;
        
            self.introF = CGRectMake(introLabelX, introLabelY, introLabelW, introLabelH);
        
            // 5.设置配图的frame
            if (_weibo.picture) {// 如果有有配图
                CGFloat pictureViewX = iconViewX;
                CGFloat pictureViewY = CGRectGetMaxY(self.introF)   padding;
                CGFloat pictureViewW = 100;
                CGFloat pictureViewH = 100;
                self.pictrueF = CGRectMake(pictureViewX, pictureViewY, pictureViewW, pictureViewH);
        
                // 6.计算行高
                self.cellHeight = CGRectGetMaxY(self.pictrueF)   padding;
            }else{
                NSLog(@"a");
                // 6.没有配图情况下的行高
                self.cellHeight = CGRectGetMaxY(self.introF)   padding;
            }
        }
        
        /**
         *  计算文本的宽高
         *
         *  @param str     需要计算的文本
         *  @param font    文本显示的字体
         *  @param maxSize 文本显示的范围
         *
         *  @return 文本占用的真实宽高
         */
        - (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize
        {
            NSDictionary *dict = @{NSFontAttributeName : font};
            // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围
            // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围
            CGSize size =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
            return size;
        }
        
        @end
        
      5. WeiboCell.h
        //
        // WeiboCell.h
        // 类新浪正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import <UIKit/UIKit.h>
        #import "WeiboFrame.h"
        
        @interface WeiboCell : UITableViewCell
        
        /*
         *  接收外界传进来的模型(包括数据模型和frame模型)
         */
        @property (nonatomic, strong) WeiboFrame *weiboFrame;
        
        //声明一个类方法,用于在声明cell时添加我们所需要的子控件
         (instancetype)cellWithTableView:(UITableView *)tableView;
        
        @end
        
      6. WeiboCell.m
        //
        // WeiboCell.m
        // 类乐乎正文Demo
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import "WeiboCell.h"
        #import "Weibo.h"
        
        #define NameFont [UIFont systemFontOfSize:15]
        #define TextFont [UIFont systemFontOfSize:16]
        
        @interface WeiboCell ()
        
        /**
         *  头像
         */
        @property (nonatomic, weak) UIImageView *iconView;
        /**
         *  vip
         */
        @property (nonatomic, weak) UIImageView *vipView;
        /**
         *  配图
         */
        @property (nonatomic, weak) UIImageView *pictureView;
        /**
         *  昵称
         */
        @property (nonatomic, weak) UILabel *nameLabel;
        /**
         *  正文
         */
        @property (nonatomic, weak) UILabel *introLabel;
        
        @end
        
        @implementation WeiboCell
         (instancetype)cellWithTableView:(UITableView *)tableView{
            static NSString *identifier = @"status";
            //从缓存中取(重用机制)
            WeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
            //如果缓存中没有,就创建
            if (cell==nil) {
                cell = [[WeiboCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
            }
            return cell;
        }
        
        /*
         * 构造方法(在初始化时会使用)
         *一般在这个方法中添加需要的空间
         */
        -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
            //重写方法的第一步应该先继承原方法,使其原有功能不缺失
            self =[super initWithStyle:style reuseIdentifier:reuseIdentifier];
        
            if (self) {
                //让自定义的cell和系统cell一样,一创建出来就有一些控件供我们使用
        
                //1.创建头像
                UIImageView *iconView = [[UIImageView alloc] init];
                [self.contentView addSubview:iconView];
                self.iconView = iconView;
        
                //2.创建昵称
                UILabel *nameLabel = [[UILabel alloc] init];
                nameLabel.font = NameFont;
                [self.contentView addSubview:nameLabel];
                self.nameLabel = nameLabel;
        
                //3.创建vip
                UIImageView *vipView = [[UIImageView alloc] init];
                vipView.image = [UIImage imageNamed:@"vip"];
                [self.contentView addSubview:vipView];
                self.vipView = vipView;
        
                //4.创建正文
                UILabel *introLabel = [[UILabel alloc] init];
                introLabel.font = TextFont;
                introLabel.numberOfLines = 0;
                [self.contentView addSubview:introLabel];
                self.introLabel = introLabel;
        
                //5.创建配图
                UIImageView *pictureView = [[UIImageView alloc] init];
                [self.contentView addSubview:pictureView];
                self.pictureView = pictureView;
            }
            return self;
        }
        
        //重写setting方法
        -(void)setWeiboFrame:(WeiboFrame *)weiboFrame{
            _weiboFrame = weiboFrame;
        
            //1.给子控件赋值数据
            [self settingData];
            //2.设置frame
            [self settingFrame];
        }
        
        -(void)settingData{
            Weibo *weibo = self.weiboFrame.weibo;
        
            //设置头像
            self.iconView.image = [UIImage imageNamed:weibo.icon];
            //设置昵称
            self.nameLabel.text = weibo.name;
            //设置vip
            if (weibo.vip) {
                self.vipView.hidden = NO;
                self.nameLabel.textColor = [UIColor redColor];
            }else{
                self.vipView.hidden = YES;
                self.nameLabel.textColor = [UIColor blueColor];
            }
            //设置内容
            self.introLabel.text = weibo.text;
            //设置配图
            if (self.pictureView) {
                self.pictureView.hidden = NO;
                self.pictureView.image = [UIImage imageNamed:weibo.picture];
            }else{
                self.pictureView.hidden = YES;
            }
        }
        
        /*
         *  设置子控件的frame
         */
        -(void)settingFrame{
            self.iconView.frame = self.weiboFrame.iconF;
            self.nameLabel.frame = self.weiboFrame.nameF;
            self.vipView.frame = self.weiboFrame.vipF;
            self.introLabel.frame = self.weiboFrame.introF;
            if (self.weiboFrame.weibo.picture) {
                self.pictureView.frame = self.weiboFrame.pictrueF;
            }
        }
        
        #pragma mark--
        - (void)awakeFromNib {
            // Initialization code
        }
        
        - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
            [super setSelected:selected animated:animated];
        
            // Configure the view for the selected state
        }
        
        @end
        
      7. ViewController.h
        //
        // ViewController.h
        // 类和讯正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import <UIKit/UIKit.h>
        
        @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
        
        @end
        
      8. ViewController.m
        //
        // ViewController.m
        // 类和讯正文德姆o
        //
        // Created by apple on 15/11/14.
        // Copyright © 2015年 apple. All rights reserved.
        //

        #import "ViewController.h"
        #import "WeiboCell.h"
        #import "Weibo.h"
        #import "WeiboFrame.h"
        
        @interface ViewController ()
        
        @property (nonatomic, strong) NSArray *statusFrames;
        
        @end
        
        @implementation ViewController
        
        - (void)viewDidLoad {
            [super viewDidLoad];
        
        }
        
        #pragma mark--
        #pragma mark  懒加载
        -(NSArray *)statusFrames{
            if (_statusFrames==nil) {
                NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil];
                NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];
                NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];
                for (NSDictionary *dict in dictArray) {
                    //创建数据模型
                    Weibo *weibo = [Weibo weiboWithDict:dict];
                    //根据数据模型创建frame模型
                    WeiboFrame *wbF = [[WeiboFrame alloc] init];
                    wbF.weibo = weibo;
                    [models addObject:wbF];
                }
                self.statusFrames = [models copy];
            }
            return _statusFrames;
        }
        
        #pragma mark--
        #pragma mark  UITableViewDataSource
        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {
            return self.statusFrames.count;
        }
        
        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            WeiboCell *cell = [WeiboCell cellWithTableView:tableView];
            //设置数据
            cell.weiboFrame = self.statusFrames[indexPath.row];
        
            return cell;
        }
        
        #pragma mark--
        #pragma mark  UITableViewDelegate
        - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
            //取出对应行的frame模型
            WeiboFrame *wbF = [_statusFrames objectAtIndex:indexPath.row];
            NSLog(@"height = %f",wbF.cellHeight);
            return wbF.cellHeight;
        }
        
        - (void)didReceiveMemoryWarning {
            [super didReceiveMemoryWarning];
            // Dispose of any resources that can be recreated.
        }
        
        @end
        
      9. storyboard中归入一个UITableView,增加Delegate和DataSource;

    2. 填补表明
      鉴于系统提供的tableview大概并不能够满足大家的支付须求,所以不经常必要大家能够自定义tableview。 自定义tableview有二种方法,一种是行使xib成立,一种是采用纯代码的方法创建。那究竟该采取哪类艺术吧? 对于样式同样的tableview,日常采纳xib实行创办;对于高度区别样,内容也不完全一致的一般选取纯代码举行自定义。(图片都以在本身的博客园上扒的,右键保存就可以)

    3. 参照他事他说加以考察资料
      1. ios开辟UI篇—使用纯代码自定义UItableviewcell完结贰个简短的今日头条界面布局-文顶顶
      2. iOS开垦UITableView 之代码自定义cell的手续

    (5)在适龄的每天调⽤代理对象(delegate)的代理方法,布告代理发生了怎么样业务

     

     

    (在调⽤在此以前剖断代理是不是贯彻了该代理⽅方法)

    二、使用纯代码自定义三个tableview的步子

    二、使用纯代码自定义四个tableview的步调

    1.新建二个接续自UITableViewCell的类

    1.新建二个承继自UITableViewCell的类

    2.重写initWithStyle:reuseIdentifier:方法

    2.重写initWithStyle:reuseIdentifier:方法

    充分全体供给体现的子控件(无需设置子控件的数量和frame,  子控件要增添到contentView中)

    增进全数须要出示的子控件(不要求设置子控件的多少和frame,  子控件要增多到contentView中)

    进行子控件二回性的性质设置(有个别属性只供给安装一回, 举个例子字体定点的图形)

    进行子控件壹回性的习性设置(有个别属性只需求安装一遍, 比方字体稳固的图片)

    本文由1010cc时时彩经典版发布于操作系统,转载请注明出处:1010cc时时彩经典版UITableView的归纳利用,纯代码完

    关键词: