问题是:我有一个自定义表格 View 单元格,它由表格 View 使用,而表格 View 又是通用的。该表格 View 的宽度通过 IB 设置为 240。假设单元格将具有与表格相同的宽度,我继续添加一些逻辑来计算 ImageView 和两个标签的矩形,随后将它们添加到单元格的内容 View 中。事实证明,我的假设是错误的。
为了找出问题所在,我继续并覆盖了 tableView:willDisplayCell:forRowAtIndexPath:。问题是这个方法显示单元格的宽度将是所需的 240 点,但它在自定义单元格 initWithStyle:reuseIdentifier: 的指定初始化程序之后被调用,奇怪的是,它返回 320 点。
以下是单元格的初始化:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
NSLog(@"cell frame at init: %@", NSStringFromCGRect(self.contentView.frame));
self.avatarView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.contentView.frame.size.height, self.contentView.frame.size.height)];
[self.contentView addSubview:self.avatarView];
self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.avatarView.frame.size.width + 10, 0, self.frame.size.width - self.avatarView.frame.size.width - 40, self.frame.size.height)];
self.nameLabel.backgroundColor = [UIColor greenColor];
[self.contentView addSubview:self.nameLabel];
self.visitorsLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.avatarView.frame.size.width + self.nameLabel.frame.size.width + 20, 0, self.frame.size.width - (self.avatarView.frame.size.width + self.nameLabel.frame.size.width + 20), self.contentView.frame.size.height)];
self.visitorsLabel.textColor = [UIColor whiteColor];
self.visitorsLabel.backgroundColor = [UIColor redColor];
[self.contentView addSubview:self.visitorsLabel];
}
return self;
}
subview 的信息以不同的方法提供。
这是 Controller 中的代码, TableView 的委托(delegate):
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NewClubTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newCell"];
Club *club = [self.clubs getClubAtIndex:indexPath.row];
cell = [[NewClubTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"newCell"];
[cell setAvatar:club.avatar name:club.name visitors:club.visitors];
return cell;
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"table view will display frame: %@", NSStringFromCGRect(cell.frame));
}
这是日志的结果:
2014-05-03 16:18:04.143 FanStation[2436:70b] cell frame at init: {{0, 0}, {320, 44}}
2014-05-03 16:18:04.144 FanStation[2436:70b] table view will display frame: {{0, 0}, {240, 44}}
2014-05-03 16:18:04.145 FanStation[2436:70b] cell frame at init: {{0, 0}, {320, 44}}
2014-05-03 16:18:04.146 FanStation[2436:70b] table view will display frame: {{0, 44}, {240, 44}}
2014-05-03 16:18:04.146 FanStation[2436:70b] cell frame at init: {{0, 0}, {320, 44}}
2014-05-03 16:18:04.147 FanStation[2436:70b] table view will display frame: {{0, 88}, {240, 44}}
2014-05-03 16:18:04.147 FanStation[2436:70b] cell frame at init: {{0, 0}, {320, 44}}
2014-05-03 16:18:04.148 FanStation[2436:70b] table view will display frame: {{0, 132}, {240, 44}}
2014-05-03 16:18:04.148 FanStation[2436:70b] cell frame at init: {{0, 0}, {320, 44}}
2014-05-03 16:18:04.149 FanStation[2436:70b] table view will display frame: {{0, 176}, {240, 44}}
如您所见,表格 View 提供了正确的宽度,但单元格仍然有自己的想法。
我的问题是如果我在这里做错了什么,是否有办法纠正这个问题?
如果您需要有关此案例的任何其他信息,我将非常乐意提供。
最佳答案
表格 View 单元格不知道它在其初始化程序中的大小。它以默认大小(320 点)初始化,然后在显示之前调整大小。不要注意 init 方法中设置的大小。
你所看到的完全正常。
您将在 View Controller 中看到与主视图相同的内容。 View 在 viewDidLoad 中以其默认大小和方向创建,然后调整大小并旋转以进行显示。
编辑:
如果您需要在调整单元格大小时收到通知,您可以实现 View Controller 方法 didLayoutSubViews。当单元格在初始化后表格 View 的初始大小时,以及在 View Controller 的内容 View 的大小发生变化之后(例如,在设备旋转之后),都会调用它。
关于ios - 为什么我的 UITableViewCell 的宽度与我的 UITableView 的宽度不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23445218/