旋转iPhone时重置自定义UITableViewCell高度

时间:2009-05-16 13:44:56

标签: iphone uitableview

我正在重载委托方法-tableView:heightForRowAtIndexPath:并使用-sizeWithFont:constrainedToSize:以编程方式设置单元格的高度,基于该单元格中的文本:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  switch (indexPath.section) {
    case(kAboutViewOverviewSection): {
      switch (indexPath.row) {
        case(kAboutViewOverviewSectionRow): {
          NSString *text = NSLocalizedString(@"kAboutViewOverviewSectionFieldText", @"");
          CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 500)];
          return s.height + 13;
        }
        default: {
          break;
        }
      }
      break;
    }
    default: {
      break;
    }
  }
  return 44.0;
}

这在首次绘制表格时有效。但是,当我更改设备的方向时,从纵向到横向,单元格高度不会改变。

我尝试覆盖表视图控制器中的-shouldAutorotateToInterfaceOrientation:方法:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [self.tableView reloadData];
  return YES;
}

这应该重新加载表数据并且(可能)重绘表格单元格视图。但这没有任何效果。

当设备旋转时,有没有办法强制单元格以新的高度重绘?

编辑:我尝试过以下操作,但没效果:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [self.tableView reloadData];
}

以下是纵向应用程序的样子:

Portait

以下是横向应用程序的样子:

Landscape

内容的顶部和底部边缘之间存在间隙。

编辑2

通过表格框架的宽度调整尺寸参数有助于解决此显示问题:

CGSize s = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width,500)];

1 个答案:

答案 0 :(得分:6)

这不是最优的,但最简单的解决方案是在桌面上调用-reloadData

如果仅定位3.0,更好的解决方案是拨打-beginUpdates-deleteRowsAtIndexPaths:withRowAnimation:-insertRowsAtIndexPaths:withRowAnimation:-endUpdates或简称-reloadSections:withRowAnimation:。这将添加动画。

编辑:您还需要一个合适的tableView:heightForRowAtIndexPath:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize textSize = [[self textForRowAtIndexPath:indexPath] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake([tableView frame].size.width - 20, 500)];
    return textSize.height + 13.0f;
}

(其中textForRowAtIndexPath:是返回单元格文本的方法)