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

时间:2013-11-13 20:32:26

标签: ios objective-c uitableview

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

Correct row height

但是,当我将设备旋转到横向模式时,我会得到比我想要的更短的行,因此,部分视图的背景是可见的,请参见此处: Rows too short, view background visible on the bottom of the table view

再次将手机恢复为纵向模式时,行大小比第一次加载视图时大,因此底部单元格看起来更小,文本看起来不在单元格的中心,看到这里:

Cells, slightly taller then at first load

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

- (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 个答案:

答案 0 :(得分:0)

我没有明确的答案,但这里有几点需要考虑:

1)你为什么要在tableView:heightForRowAtIndexPath中调用[self.tableview setNeedsDisplay]?如果你需要在这里重置显示,你的整体逻辑可能有问题。

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

2)此代码在轮换后运行。尝试注销不同的常量并手动仔细检查数学。这可能会让您更好地了解正在发生的事情。可能存在计时问题 - 例如,您可能在轮换发生之前获取状态栏高度,而不是在它发生之后。