iOS-UITableView Cell加载问题

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长这样


iOS-UITableView Cell加载问题_第1张图片
xib图

cell的.m文件添加空间

- (void)awakeFromNib {

[super awakeFromNib];

}

- (void)initView {

UIView *view = [[UIView alloc] initWithFrame:self.frame];

view.backgroundColor = [UIColor orangeColor];

[_bgView addSubview:view];

}

运行出来后会发现xib中加约束的都正常,在代码中添加的空间没有适配屏幕,如图:

iOS-UITableView Cell加载问题_第2张图片

原因是因为- (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;

}


iOS-UITableView Cell加载问题_第3张图片

到这解决问题了。


突然想到那个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;

}

效果图:

iOS-UITableView Cell加载问题_第4张图片

这么乱总结一下,cellForRowAtIndexPath方法初始化的时候是不知道cell的实际高度的,当-(void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section方法调用的时候才可以得到实际cell的高度。最后那个突想和别的没什么区别。。。

过几天把这几天碰到的UICollectionView问题写一写 T_T。

你可能感兴趣的:(iOS-UITableView Cell加载问题)