iOS设备旋转时返回的行高度不正确

iOS设备旋转时返回的行高度不正确,ios,objective-c,uitableview,Ios,Objective C,Uitableview,旋转设备后,在UITableView中显示高度正确的UITableViewCells时出现问题。 最初加载表视图时,所有行的大小都正确,如下图所示: 但是,当我将设备旋转到横向模式时,我得到的行数比我想要的要短,因此,视图的部分背景可见,请参见此处: 当再次将手机调回纵向模式时,行大小比第一次加载视图时大,因此底部单元格看起来更小,并且文本看起来不在单元格中央,请参见此处: 这是我用于行高计算的方法和变量: - (CGFloat)tableView:(UITableView *)table

旋转设备后,在UITableView中显示高度正确的UITableViewCells时出现问题。 最初加载表视图时,所有行的大小都正确,如下图所示:

但是,当我将设备旋转到横向模式时,我得到的行数比我想要的要短,因此,视图的部分背景可见,请参见此处:

当再次将手机调回纵向模式时,行大小比第一次加载视图时大,因此底部单元格看起来更小,并且文本看起来不在单元格中央,请参见此处:

这是我用于行高计算的方法和变量:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    CGFloat statusBarWidth = [UIApplication sharedApplication].statusBarFrame.size.width;
    CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height;
    CGFloat rowHeight;

    NSUInteger numberOfRows = self.orderedCategories.count;

    if (orientation == UIDeviceOrientationPortrait) {
        rowHeight = ((screenHeight - navigationBarHeight - statusBarHeight) / numberOfRows);
        NSLog(@"portrait: %f", rowHeight);
    } else {
        rowHeight = ((screenWidth - navigationBarHeight - statusBarWidth) / numberOfRows);
        NSLog(@"landscape: %f", rowHeight);
    }

    return rowHeight;
}

我没有确切的答案,但有几件事需要考虑:

1) 为什么在tableview:heightForRowAtIndexPath中调用[self.tableview setNeedsDisplay]?如果需要在此处重置显示,则可能是您的总体逻辑有问题

2) 将计算代码移出didRotateFromInterfaceOrientation:方法怎么样?然后在完成后调用reloadData。将高度存储在实例变量中,只需在tableView中返回该高度:heightForRowAtIndexPath:


2) 此代码是否在旋转后运行。尝试记录不同的常数,并用手仔细检查数学。这可能会让你更好地了解正在发生的事情。可能存在计时问题——例如,您可能在旋转发生之前而不是旋转发生之后获取状态栏高度。

[self.tableView setNeedsDisplay]
消息发送留在那里进行调试,我已更新了问题并删除了行。但你是对的,这是一个时间问题。方法
-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
在布局视图之前已设置单元格,因此我得到的导航栏高度值不正确。