ios - 为什么我的 UITableViewCell 的宽度与我的 UITableView 的宽度不同?

标签 ios objective-c xcode uitableview

问题是:我有一个自定义表格 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/

相关文章:

ios - 使用 If 条件执行 segue 和发送数据

ios - 如何在 Catalina 中访问 "iTunes Sharing"文件?

ios - XCode 对成员的不明确引用

c++ - Xcode 4.2 创建 xcode 示例项目

ios - CoreData IOS中如何正确获取ObjectId?

ios - 将 SKShader 应用于多个图层

iphone - 另一个 Xcode 项目中的 undefined symbol

ios - Paypal API错误

objective-c - 如何在 Objective-C/Xcode/iOS 中的 .lib 文件中隐藏 url

ios - 本地 CocoaPod 规范失败