UITableView 高级

UITableView 高级 

    自定义cell

    1.创建一个继承于UITableViewCell的子类

    2.根据展示的内容, 选择合适的控件, 并写属性

    3.重写cell的初始化方法, 在方法内部, 创建控件

    4.使用cell

PersonCell.m
#import <UIKit/UIKit.h>
@interface PersonCell : UITableViewCell
//注: 不要和UITableViewCell的属性重名
@property (nonatomic, retain) UIImageView *photoView;
@property (nonatomic, retain) UILabel *nameLabel, *genderLabel, *signatureLabel;
@end
PersonCell.m
#import "PersonCell.h"
#define kMargin 10
#define kImageSize 80
#define KNameWidth 150
#define KLabelHeight 35
#define KScreenWidth [UIScreen mainScreen].bounds.size.width
@implementation PersonCell
- (void)dealloc {
    [_photoView release];
    [_nameLabel release];
    [_genderLabel release];
    [_signatureLabel release];
    [super dealloc];
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
         头像
        self.photoView = [[UIImageView alloc] initWithFrame:CGRectMake(kMargin, kMargin, kImageSize, kImageSize)];
        //圆角的半径
        self.photoView.layer.cornerRadius = 40;
        self.photoView.clipsToBounds = YES;
//        self.photoView.layer.masksToBounds = YES;
        self.photoView.layer.borderWidth = 2;
        self.photoView.layer.borderColor = [UIColor colorWithRed:0.645 green:1.000 blue:0.970 alpha:1.000].CGColor;
        [self.contentView addSubview:_photoView];
        [_photoView release];

        姓名
        self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(kMargin * 2 + kImageSize, kMargin, KNameWidth, KLabelHeight)];
//        self.nameLabel.backgroundColor = [UIColor redColor];
        [self.contentView addSubview:_nameLabel];
        [self.nameLabel release];

        CGRect rect = CGRectMake(10, 10, 50, 50);
        获取矩形区域的宽度
        CGRectGetWidth(rect);
        获取矩形区域的高度
        CGRectGetHeight(rect);
        获取矩形区域的最小的X值
        CGRectGetMinX(rect);
        获取矩形区域的中间的X值
        CGRectGetMidX(rect);
        获取矩形区域的最大的X值
        CGRectGetMaxX(rect);
        //性别
        self.genderLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.nameLabel.frame) + kMargin, kMargin,KScreenWidth - kMargin * 2 - CGRectGetMaxX(self.nameLabel.frame) , KLabelHeight)];
//        self.genderLabel.backgroundColor = [UIColor greenColor];
        [self.contentView addSubview:_genderLabel];
        [self.genderLabel release];

        //个性签名
        self.signatureLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.nameLabel.frame), CGRectGetMaxY(self.nameLabel.frame) + kMargin, KScreenWidth - 2 * kMargin - CGRectGetMaxX(self.photoView.frame), KLabelHeight)];
        self.signatureLabel.font = [UIFont systemFontOfSize:13];
        self.signatureLabel.numberOfLines = 0;
//        self.signatureLabel.backgroundColor = [UIColor blueColor];
        [self.contentView addSubview:_signatureLabel];
        [self.signatureLabel release];

    }
    return self;
}

   

多种cell的混合使用

    1.根据需求不同, 返回不同的cell

    2.必须保证cell的重用标志是不同的

UITableViewCell.h
#import <UIKit/UIKit.h>
@interface MessageCell : UITableViewCell
@property (nonatomic, retain) UIImageView *photoView;
@property (nonatomic, retain) UILabel *chatLabel;
@end
UITableViewCell.m
#import "MessageCell.h"

#define KImageSize 80
#define kMargin 10
#define KScreenWidth [UIScreen mainScreen].bounds.size.width

@implementation MessageCell

- (void)dealloc {
    [_photoView release];
    [_chatLabel release];
    [super dealloc];
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.photoView = [[UIImageView alloc] initWithFrame:CGRectMake(KScreenWidth - KImageSize - kMargin , kMargin, KImageSize, KImageSize)];
        self.photoView.layer.cornerRadius = 40;
        self.photoView.clipsToBounds = YES;
        self.photoView.layer.borderWidth = 2;
        self.photoView.layer.borderColor = [UIColor colorWithRed:0.645 green:1.000 blue:0.970 alpha:1.000].CGColor;
        [self.contentView addSubview:_photoView];
        [_photoView release];

        self.chatLabel = [[UILabel alloc] initWithFrame:CGRectMake(kMargin, kMargin, KScreenWidth - 3 * kMargin - KImageSize, KImageSize)];
        self.chatLabel.numberOfLines = 0;
        self.chatLabel.backgroundColor = [UIColor colorWithRed:0.789 green:1.000 blue:0.970 alpha:1.000];
        self.chatLabel.layer.borderWidth = 1;
        [self.contentView addSubview:_chatLabel];
        [_chatLabel release];
    }
    return  self;
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    // Return the number of sections.
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row % 2 == 0) {
        static NSString *string = @"OK";
        PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
        if (cell == nil) {
            cell = [[PersonCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:string];
        }
        cell.photoView.image = [UIImage imageNamed:@"image.jpg"];
        cell.nameLabel.text = @" 美眉";
        cell.genderLabel.text = @"女";
        cell.signatureLabel.text = @"个性签名: 当你对成功的渴望足以与呼吸的欲望相媲美时,你就会成功!";
        return cell;

    } else {
    static NSString *string = @"Hello";
    MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
    if (cell == nil) {
        cell = [[MessageCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:string];
    }
    cell.photoView.image = [UIImage imageNamed:@"other.jpg"];
    cell.chatLabel.text = @"    让人迷茫的原因只有一个,那就是本该拼搏的年纪,想的太多,做的太少。";
    return cell;
    }
}

    动态cell高度

    1.展示内容的控件的高度修改

    a. numberOfLines

    b. boundingRectWithSize

    2.修改cell的高度

 HomeTableViewCell.h
#import <UIKit/UIKit.h>
@class Joke;
@interface HomeTableViewCell : UITableViewCell
@property (nonatomic, retain) UILabel *nameLabel, *contentLabel;
自定义cell的优化方法, 对cell上展示的内容, 写一个方法封装起来, 方便赋值
- (void)showContent:(Joke *)joke;
+ (CGFloat)calculateRowHeight:(Joke *)joke;
@end
HomeTableViewCell.m
#import "HomeTableViewCell.h"
#import "Joke.h"
@implementation HomeTableViewCell
- (void)dealloc {
    [_nameLabel release];
    [_contentLabel release];
    [super dealloc];
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        //姓名
        self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 355, 20)];
//        self.nameLabel.backgroundColor = [UIColor colorWithRed:0.658 green:1.000 blue:0.975 alpha:1.000];
        [self.contentView addSubview:_nameLabel];
        [_nameLabel release];

        //内容
        self.contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 355, 20)];
        self.contentLabel.backgroundColor = [UIColor colorWithRed:1.000 green:0.988 blue:0.889 alpha:1.000];
        self.contentLabel.numberOfLines = 0;
        [self.contentView addSubview:_contentLabel];
        [_contentLabel release];

    }
    return self;
}

- (void)showContent:(Joke *)joke {
    self.nameLabel.text = joke.name;
    self.contentLabel.text = joke.content;

    通过内容, 计算高度
    参数1: 展示内容的容器大小(CGSize)
    参数2: 计算方式(行高 + 间距)(NSStringDrawingOptions)
    参数3: 文字样式(文字大小)(NSDictionary *)
    参数4: 传递参数使用(NSStringDrawingContext *)
    NSDictionary *dic = @{NSFontAttributeName: [UIFont systemFontOfSize:17]};
    CGRect rect = [joke.content boundingRectWithSize:CGSizeMake(355, 0) options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:dic context:nil];
    CGRect frame = self.contentLabel.frame;
    frame.size.height = rect.size.height;
    self.contentLabel.frame = frame;

}

+ (CGFloat)calculateRowHeight:(Joke *)joke {
    NSDictionary *dic = @{NSFontAttributeName: [UIFont systemFontOfSize:17]};
    CGRect rect = [joke.content boundingRectWithSize:CGSizeMake(355, 0) options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:dic context:nil];
    return rect.size.height + 20 + 30;
}

@end
Joke.h
#import <Foundation/Foundation.h>

@interface Joke : NSObject

@property (nonatomic, retain) NSString *name, *content;

- (instancetype)initWithName:(NSString *)namae content:(NSString *)content;
+ (instancetype)jokeWithName:(NSString *)namae content:(NSString *)content;

@end
Joke.m
#import "Joke.h"
@implementation Joke
- (void)dealloc {
    [_name release];
    [_content release];
    [super dealloc];
}

- (instancetype)initWithName:(NSString *)namae content:(NSString *)content {
    if (self = [super init]) {
        self.name = namae;
        self.content = content;
    }
    return self;
}
+ (instancetype)jokeWithName:(NSString *)namae content:(NSString *)content {
    return [[Joke alloc] initWithName:namae content:content];
}

@end
- (void)creatData {
    Joke *joke1 = [Joke jokeWithName:@"忠忠" content:@"1、毕业后才知道校园恋爱是最纯洁的;2、毕业后才知道学习是最重要的;3、毕业后才知道校园生活是最幸福的;4、毕业后才知道宿舍生活是最好的;5、毕业后才知道食堂的饭菜是最便宜的;6、毕业后才知道上学是最美妙的事。7、毕业后才知道学生花钱最大手大脚......"];
    Joke *joke2 = [Joke jokeWithName:@"老王" content:@"一年奔波,尘缘遇了谁;一句珍重,天涯别了谁;一点灵犀,凭栏忆了谁;一种相思,闲愁予了谁;一江明月,豪情酬了谁;一场冬雪,烟波忘了谁;一壶浊酒,相逢醉了谁;一世浮生,轻狂撩了谁;一封短信,才情念了谁;一番思量,谁是谁的谁 ;一枚围脖,转发回复谁....."];
    Joke *joke3 = [Joke jokeWithName:@"蹦蹦" content:@"人与人间的信任,就像是纸片,一旦破损,就不会再回到原来的样子。"];
    Joke *joke4 = [Joke jokeWithName:@"小强" content:@"记者:说真的,你真的会给给孩子换尿布吗? 姚明:要不你躺下,我给你换一个!实话告诉你,我用一只脚就能给孩子换尿布,喂奶啥的,都行。 记者:我不信! 姚明:真的,连灯都不用开。 记者:不可能!你说怎么换? 姚明:一只脚把媳妇揣醒就得。"];
    Joke *joke5 = [Joke jokeWithName:@"广恩" content:@"一生只谈三次恋爱最好,一次懵懂,一次刻骨,一次一生。谈的太多会比较,无法确定;经历太多会麻木,不再相信爱情,行尸走肉,最后与不爱的人结婚,无法发自内心的爱对方,日常表现的应付,对方则抱怨你不够关心和不顾家,最后这失败的爱情,让你在遗憾和凑合中走完一生。"];
    Joke *joke6 = [Joke jokeWithName:@"歌星" content:@"我们常常看到的风景是:一个人总是仰望和羡慕着别人的幸福,一回头,却发现自己正被仰望和羡慕着。其实,每个人都是幸福的。只是,你的幸福,常常在别人眼里 。"];
    self.jokeArray = [@[joke1, joke2, joke3, joke4, joke5, joke6] mutableCopy];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return self.jokeArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"cell";
    HomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[HomeTableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:identifier];
    }
//    cell.textLabel.text = @"Hello World!";
    Joke *joke = _jokeArray[indexPath.row];
    [cell showContent:joke];
    return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [HomeTableViewCell calculateRowHeight:self.jokeArray[indexPath.row]];
}

 

 

时间: 2024-10-27 06:15:13

UITableView 高级的相关文章

第?一讲:UITableView 高级 自定义cell , cell自适应高度

一.自定义cell(包括cell的自定义,以及直接赋值的方法) 自定义cell就是创建一个UITableViewCell的子类. 把cell上的控件创建都封装在子类中,简化UIViewController中的代码 示例代码分析:(这个例子包括cell的自定义,以及直接赋值的方法) 1.需要建立tabelViewCell类, 在其中进行cell上控件的添加 2.在tabelViewCell.m中进行初始化,和layoutSubviews的frame布局的操作 tabelViewCell.h定义属性

iOS开发——UI篇Swift篇&amp;玩转UItableView(二)高级功能

UItableView高级功能 1 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewDelegate { 2 3 var titleString:String! 4 5 @IBOutlet var titleLabel:UILabel! 6 @IBOutlet var listTableView : UITableView! 7 @IBOutlet var editDoneBut

iOS开发——UI篇Swift篇&amp;玩转UItableView(一)基本使用

UItableView基本使用 1 class ListViewController: UIViewController , UITableViewDataSource, UITableViewDelegate { 2 3 //定义listTableView 输出口 4 @IBOutlet var listTableView : UITableView! 5 6 //定义数组 7 var items:[String] = ["UITableView高级使用", 8 "自定义U

swift目录

第二部分 实 战 第3章 UI基础 138 3.1 iOS开发平台限制和方式 138 3.2 iOS SDK介绍 141 第4章 UI开发与控件 182 4.1 窗口与视图 182 4.1.1 UIScreen.UIWindow和UIView 182 4.1.2 界面旋转和大小处理 188 4.2 图片资源的使用 191 4.3 UILabel 201 4.4 UITextField 206 4.5 UIButton 216 4.6 UITableView 221 4.6.1 UITableVi

iOS开发——高级UI&amp;带你玩转UITableView

带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实际开发中用起来却没有那么简单就是因为他结合MVC使用,涉及到了模型数据的读取,自定义View,功能的拓展和更好的解藕,下面就带你玩一遍: UITableView的两种样式 UITableViewStylePlain UITableViewStyleGroupeds accessoryType UIT

UI学习笔记---第十一天UITableView表视图高级-自定义cell

自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代码 cell中的空间如何显示Model中的信息 cell中声明一个Model类型的属性,viewController中获取到Model对象后赋值给cell的Model属性 cell中重写Model的setter方法,把Model对象中的内容重新赋值给各个控件 M和V不直接通信,C负责M和V之间进行通

[iOS]过渡动画之高级模仿 airbnb

注意:我为过渡动画写了两篇文章:第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 Mac 上的文件预览动画.第二篇:[iOS]过渡动画之高级模仿 airbnb,主要基于第一篇的理论来实现复杂的界面过渡,包括进入和退出动画的串联.最后将这个动画的实现部分与当前界面解耦,并封装为一个普适(其他类似界面也适用)的工具类. 这两篇文章将会带你学到如何实现下图 airbnb 首页类似的过渡动画

iOS开发——实战篇Swift篇&amp;UItableView结合网络请求,多线程,数据解析,MVC实战

UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来. 好了,废话不多说,我们直接开始吧. 首先看看最终的效果: 是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢

UI高级-沙盒

[day3_1_Sandbox]:沙箱的介绍 snadbox沙箱沙盒 沙箱根目录下的几个文件夹: 1.应用名称.app存放应用程序的素材 2.Documents:存放应用运行时需要用到的数据(关键性数据),此路径可读可写是经常打交道的一个路径(itunes备份时会备份) 3.Library/Caches:缓存文件夹(itunes备份时不会备份) 4.Library/Preference:用来存放程序的偏好设置,系统提供了api直接操作此文件夹下面的文件 5.tmp:临时文件夹,里面的数据系统会固