【iOS】UI学习——cell的复用及自定义cell

打印 上一主题 下一主题

主题 767|帖子 767|积分 2301

媒介

  Cell复用和自定义Cell是在开辟iOS应用时常见的一种优化本领和定制需求。
  Cell复用是UITableView或UICollectionView的一个紧张优化机制。当用户滚动这些视图时,只有少量可见的Cell会被现实创建和显示,对于那些临时不可见的Cell,体系会将它们缓存起来以备未来复用。这个机制紧张是为了进步应用的性能,因为创建和烧毁视图都是相对高开销的操纵,通过复用Cell,我们可以避免不必要的视图创建和烧毁,从而进步应用的滚动性能。
  自定义Cell可以让你更好地控制Cell的表面和行为,进步代码的可读性和可维护性。自定义Cell紧张的步调包罗创建自定义Cell类,添加UI元素,实现初始化方法,设置Cell的布局,以及在TableView中使用自定义Cell。
  在现实开辟中,我们通常会结合使用Cell复用和自定义Cell,以达到既优化性能又满足特定需求的目的。
cell的复用

  Cell的复用是一种优化技术,紧张用于iOS的UITableView和UICollectionView。需要留意的是,固然这两种视图的实现方式略有不同,但复用的基本头脑是相同的。
  当用户滚动UITableView或UICollectionView时,屏幕上显示的cell只是所有数据的一小部分。当某个cell滚动出屏幕时,体系会将其放入一个队列中等待复用,而不是立即烧毁。当需要显示新的cell时,体系起首会检查这个队列,看看是否有可以复用的cell。如果有,就直接使用,如果没有,才会创建新的cell。
  这种复用机制可以极大地进步应用的性能。因为创建和烧毁视图是相对淹灭资源的操纵,通过复用,可以减少这些操纵,从而使滚动更加流畅。
  在实现cell复用时,需要给cell设定一个复用标识符(reuse identifier),然后在需要新的cell时,使用这个标识符去请求。如果队列中有可复用的cell,体系就会返回一个,否则就会创建新的cell。标识符的设定,使得我们可以为不同类型的cell设定不同的复用标识符,从而在同一个表视图或集合视图中使用多种类型的cell。
手动(非注册)

手动举行Cell复用紧张涉及到以下几个步调:

  • 设置复用标识符:在创建Cell的时候,我们需要给每个Cell设置一个复用标识符,这个标识符通常是一个字符串,用来表现这个Cell的类型。在创建Cell的时候,我们会把这个标识符作为参数传入。
  • 请求重用的Cell:在需要显示新的Cell时,我们会使用复用标识符去请求一个已经不再显示,但是还没有被烧毁的Cell。这个请求的过程是通过调用UITableView或UICollectionView的dequeueReusableCell(withIdentifier方法来完成的,这个方法会返回一个可选类型的Cell,如果有可用的重用Cell,就会返回一个Cell,否则返回nil。
  • 设置Cell:无论是新创建的Cell还是重用的Cell,都需要举行设置,以显示新的数据。设置Cell通常会在tableView(:cellForRowAt或collectionView(:cellForItemAt方法中完成。
代码示例:
  1. 1. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  2.     static NSString *strID = @"id";
  3.     UITableViewCell *cell = [_tabView dequeueReusableCellWithIdentifier: strID];
  4.     if (cell == nil) {
  5.         cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: strID];
  6.     }
  7.     cell.textLabel.text = @"aaa";
  8.     return cell;
  9. }
复制代码
自动(注册)

在iOS开辟中,TableView和CollectionView的Cell复用是自动完成的,你只需要准确地设置复用标识符并在需要时请求复用的Cell。具体步调如下:

  • 设置复用标识符:当你创建自定义Cell的时候,需要为每一个Cell类型设置一个唯一的复用标识符。你可以在Cell的初始化方法中或者在Storyboard中设置这个标识符。
  • 请求重用的Cell:在tableView(:cellForRowAt或collectionView(:cellForItemAt方法中,你需要使用复用标识符来请求一个可复用的Cell。你可以使用dequeueReusableCell(withIdentifier方法来完成这个请求。如果有可复用的Cell,这个方法会返回一个Cell,否则返回nil。
  • 创建新的Cell:如果dequeueReusableCell(withIdentifier方法返回nil,说明没有可复用的Cell,你需要创建一个新的Cell。
  • 设置Cell:对于得到的Cell,无论是新创建的还是复用的,你都需要按照当前的数据来设置它们。
代码示例:
  1. 1. (void)viewDidLoad
  2. {
  3.     [super viewDidLoad];
  4.     // 如果使用 Nib 自定义 Cell
  5.     [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"myCell"];
  6.     // 如果使用代码自定义 Cell
  7.     [self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"myCell"];
  8. }
复制代码
自定义cell

自定义Cell是在开辟iOS应用时常用的一种方式,它能让你更好地控制Cell的表面和行为,进步代码的可读性和可维护性。自定义Cell紧张的步调包罗:

  • 创建自定义Cell类:起首,需要创建一个新的类,这个类通常会继承自UITableViewCell或UICollectionViewCell。
  • 添加UI元素:在这个自定义Cell类中,我们可以添加你需要的UI元素,如UILabel,UIImageView等。
  • 实现初始化方法:在自定义Cell类的初始化方法中,需要初始化我们添加的UI元素,并添加到Cell的contentView上。
  • 设置Cell的布局:还需要在自定义Cell类中设置UI元素的布局,可以使用Auto Layout来完成这个任务。
  • 在TableView中使用自定义Cell:在TableView的tableView(_:cellForRowAt方法中,我们需要先通过复用标识符尝试获取一个可复用的Cell,如果没有获取到,那么就创建一个新的自定义Cell实例,并返回。
通过自定义Cell,我们可以根据自己的需求来定制Cell的表面和行为,使我们的应用更具个性化。
代码示例:
先创建一个子类myCell,从属于UITableViewCell类。

myCell.h:
  1. #import <UIKit/UIKit.h>
  2. NS_ASSUME_NONNULL_BEGIN
  3. @interface myCustomCell : UITableViewCell
  4. @property (nonatomic, strong) UILabel *titleLabel;
  5. @property (nonatomic, strong) UILabel *subtitleLabel;
  6. @end
  7. NS_ASSUME_NONNULL_END
复制代码
myCell.m:
  1. #import "myCell.h"
  2. @implementation myCustomCell
  3. - (void)awakeFromNib {
  4.     [super awakeFromNib];
  5.     // Initialization code
  6. }
  7. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  8.     [super setSelected:selected animated:animated];
  9.     // Configure the view for the selected state
  10. }
  11. //重写父类的初始化方法,根据需求添加自己的逻辑
  12. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  13.     self = [super initWithStyle:style  reuseIdentifier:reuseIdentifier];
  14.     if ([reuseIdentifier isEqualToString:@"indentifierCell"]) {
  15.         _titleLabel = [[UILabel alloc] init];
  16.         _titleLabel.textColor = [UIColor blueColor];
  17.         _titleLabel.font = [UIFont systemFontOfSize:20];
  18.         [self.contentView addSubview:_titleLabel];
  19.         
  20.         _subtitleLabel = [[UILabel alloc] init];
  21.         _subtitleLabel.textColor = [UIColor cyanColor];
  22.         _subtitleLabel.font = [UIFont systemFontOfSize:15];
  23.         [self.contentView addSubview:_subtitleLabel];
  24.     }
  25.     return self;
  26. }
  27. //重写布局方法,根据需求自己设置
  28. - (void)layoutSubviews {
  29.     _titleLabel.frame = CGRectMake(40, 20, self.contentView.bounds.size.width - 40, 20);
  30.     _subtitleLabel.frame = CGRectMake(40, 40, self.contentView.bounds.size.width - 40, 20);
  31. }
  32. @end
复制代码
ViewController .h:
  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. <
  4. //实现数据视图的普通协议
  5. //数据视图的普通事件处理
  6. UITableViewDelegate,
  7. //实现数据视图的数据代理协议
  8. //处理数据视图的数据代理
  9. UITableViewDataSource
  10. >
  11. {
  12.     //定义一个数据视图对象
  13.     //数据视图用来显示大量相同格式的信息的视图
  14.     UITableView* _tableview;
  15. }
  16. @end
复制代码
ViewController .m:
  1. #import "ViewController.h"
  2. #import "myCell.h"
  3. @interface ViewController ()
  4. @end
  5. @implementation ViewController
  6. - (void)viewDidLoad {
  7.     [super viewDidLoad];
  8.     // Do any additional setup after loading the view.
  9.      //创建数据视图
  10.     _tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];
  11.      //设置数据视图的代理对象
  12.     _tableview.delegate = self;
  13.      //设置数据视图的数据源对象
  14.     _tableview.dataSource = self;
  15.     //注册子类
  16.     [_tableview registerClass:[myCustomCell class] forCellReuseIdentifier:@"indentifierCell"];
  17.     [self.view addSubview:_tableview];
  18. }
  19. // 设置数据视图的组数
  20. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  21.     return 1;
  22. }
  23. //获取每组元素的行数
  24. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  25.     return 15;
  26. }
  27. //创建单元格对象函数
  28. -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  29.     myCustomCell* cell = [_tableview dequeueReusableCellWithIdentifier:@"indentifierCell" forIndexPath:indexPath];
  30.     cell.titleLabel.text = @"一级标题";
  31.     cell.subtitleLabel.text = @"二级标题";
  32.     return cell;
  33. }
  34. @end
复制代码
总结

  通过对cell的复用和自定义cell,我们可以对自己写的页面举行更多的个性化设置。以上就是本篇博客关于cell复用和自定义cell的全部内容,欢迎大家学习和指正~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表