UITableView这控件不用多介绍了
虽然用的多,却还是发现自己平时忽略的问题
场景:cell高度不固定,而且内容也不好在xib中全部创建出来,需要在代码里创建
#pragma mark - tableView 代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 80 + indexPath.row * 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"TableCell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:nil options:nil] lastObject];
}
[cell initView];
return cell;
}
然后xib长这样
cell的.m文件添加空间
- (void)awakeFromNib {
[super awakeFromNib];
}
- (void)initView {
UIView *view = [[UIView alloc] initWithFrame:self.frame];
view.backgroundColor = [UIColor orangeColor];
[_bgView addSubview:view];
}
运行出来后会发现xib中加约束的都正常,在代码中添加的空间没有适配屏幕,如图:
原因是因为- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中加载出来的cell是默认高度,如果加载的xib则是xib中cell的高度,init出来的默认高度则是44.
解决办法:
1:用代码加上约束,不用frame适配
2:其实.其实.其实cellForRowAtIndexPath定义cell的时候可以改变cell.frame大小!!!
cellForRowAtIndexPath方法改成
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"TableCell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:nil options:nil] lastObject];
}
CGRect frame = cell.frame;
frame.size.height = 80 + indexPath.row * 10;
frame.size.width = Screen_w;
cell.frame = frame;
[cell initView];
return cell;
}
到这解决问题了。
突然想到那个cell悬浮在中间的UI就可以这样写了:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"TableCell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:nil options:nil] lastObject];
}
CGRect frame = cell.frame;
// frame.size.height = 80 + indexPath.row * 10;
// frame.size.width = Screen_w;
frame.size.width = Screen_w - 40;
frame.origin.x = 20;
frame.size.height = 80;
frame.origin.y = indexPath.row * 10 / 2;
cell.frame = frame;
[cell initView];
return cell;
}
效果图:
这么乱总结一下,cellForRowAtIndexPath方法初始化的时候是不知道cell的实际高度的,当-(void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section方法调用的时候才可以得到实际cell的高度。最后那个突想和别的没什么区别。。。
过几天把这几天碰到的UICollectionView问题写一写 T_T。