这两天在做tableview时,遇到一些适配的问题,比如下面:
屏幕旋转时,tableview并不能充满屏幕,这种需要加约束,有没有一种方法可以简化呢?答案是使用系统自带的UItableview的类去创建,系统会自带生成一些代理方法,这个时候创建的UItableview是自动布局好的,会适应各种屏幕和旋转。
系统的类不需要写创建UItableview的代码,也不用写代理,系统封装好了,里面有个self.tableview,下面代理的方法也已写好是不是很方便~
创建cell时,可以纯代码手写,在cell文件的.M文件中我是这样写的:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.headerView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 80, 80)];
// self.headerView.backgroundColor = [UIColor yellowColor];
[self addSubview:self.headerView];
// 加入自己定义的空间的frame
}
return self;
}
下面是纯代码的自适应高度:
[self.headerView sizeToFit];//自适应
在控制器里面复用就行了:
CustomViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifer];
if (cell == nil) {
cell = [[CustomViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer];
}
如果从xib文件中加载呢?
先注册一个NIB:
[self.tableView registerNib:[UINib nibWithNibName:@"CustomTableViewCell" bundle:nil] forCellReuseIdentifier:string];
就是告诉系统从XIb文件中加载cell,这个方法后内存中就已经有xib的文件了。很好地满足了我们的需求:既从nib加载,又能对cell进行重用。
在复用方法中就省略了很多代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// static NSString *string = @"cell";
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string forIndexPath:indexPath];
// -----------------------------定制cell
return cell;
}
解释一下:
1.UINib是一个IOS4.0才出现的类,与MAC上的NSNib类作用相似, 就是加速频繁使用的NIB文件的加载。在第一次从硬盘加载NIB时,它在内存中缓存NIB文件对象。之后加载NIB文件时就会从内存拷贝而避免了较慢的硬盘访问。Apple宣称可以在 加载NIB文件时提供 2倍的速度提升 。 使用UINib的最明显的地方就是在需要在每次创建新Cell时从NIB文件中加载Cell的UITableViewControllers中。UINib的优势就是在不用大量修改代码的情况获得性能改进。其实简单地说,就是利用缓存机制避免了频繁从硬盘中加载XIB文件,这在大数据量的时候显得尤为有用。
2.除了上述代码,还需要在xib文件中做如下设置:在Cell.xib的Inspector窗口中将Identifier进行设置,这里的Identifier要与cellForRowAtIndexPath中一致。
其中第二条我看很多都没加,目前不清楚需不需要~记录一下,留待考究~