【问题标题】:Accessing "default" methods of UITableView访问 UITableView 的“默认”方法
【发布时间】:2011-01-11 16:44:39
【问题描述】:

我尝试设置一个tableView。除了最后一节(包含一行)之外,我对所有节的行都使用标准单元格。因此,我还想对除特殊部分之外的所有部分使用标准布局。

一个简短的例子如下,我的“特殊”单元格在第 3 部分(只有一行):

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section == 3)
        return 5;
    return **????**;
}

在???我想返回从UITableView计算的宽度(就像我没有实现该方法一样)。

[超级自我:tableView heightForHeaderInSection:(NSInteger)section];

不起作用。我知道我可以访问

[tableView setionHeaderHeight]

默认为 10,显然没有考虑到我有其他部分的部分标题,这将需要额外的空间。我试过了,但它会让部分太近(见截图):

(注意:我感兴趣的部分是看起来不像单元格的部分:带有日期(不可见背景)的部分)。

因此,最简单的方法是将布局移交给完美的标准实现 - 除了第 3 节。

我有什么选择?

【问题讨论】:

    标签: iphone ios uitableview


    【解决方案1】:

    以防万一:iOS 5 中引入了一个新常量,称为UITableViewAutomaticDimension。正如文档所说,当您希望 UITableView 使用默认值时,您应该从您的委托方法中返回它。

    因此,您的案例的代码是:

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
        if (section == 3) {
           return 5;
        } else {
           return UITableViewAutomaticDimension;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您似乎对heightForHeaderInSection 有点困惑 - 它返回表格部分标题的高度(这是表格部分的“标题”),而不是一行。 iOS 调用此方法只询问单个节标题的高度,而不考虑可能存在的任何其他节标题。

      如果您想使用默认值,只需为 3 以外的任何部分返回 [tableView sectionHeaderHeight] - 您不需要“考虑到 [您] 有其他部分标题”,因为它要求section 的标头高度。它会再次询问其他人的高度(并自动计算行和其他部分的相对位置)。

      【讨论】:

      • 我把描述写得更清楚了。我确定我没有感到困惑。也许描述令人困惑......
      • 如果我返回默认值,整个布局是错误的——节标题显然没有考虑节标题。
      • 定义“整个布局是错误的”。我不知道“节标题显然不考虑节标题”是什么意思,因为根据定义,它们是节标题。您是否通过委托方法tableView:viewForHeaderInSection: 返回自定义标题视图?如果是这样,您可以只返回相应视图的高度。
      • 添加了截图。在这里,heightForHeaderSection 总是返回 10。注意:我感兴趣的部分是带有日期的部分(不可见背景)。
      【解决方案3】:

      您没有超级实现tableView:heightForHeaderInSection:,因为您没有为UITableViewDelegate 子类化任何抽象基实现。相反,表格视图是通过检查您的委托实现以查看该方法是否可用来决定是否应使用默认高度。

      这是一个非常庞大的概念,特别是如果来自 Java 或 C#。 Objective-C 协议中的方法可以是可选的,它们的缺失意味着使用默认值。

      您的方法可能应该实现为:

      - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
          if (section == 3) {
             return 5;
          } else {
             return 36;
          }
       }
      

      分组表视图和普通表视图的默认高度不同(普通表视图为 22 点)。 UITableView 不会公开默认值,甚至不会作为私有方法公开。在http://bugreport.apple.com 提交错误以使其成为公共常量。

      【讨论】:

      • ... 正如我所写:这导致了如上图所示的布局。 taleView.sectionHeaderHeight 不考虑节标题所需的空间。 taleView.sectionHeaderHeight 是 10,绝对不够。通过实验,我会说我需要大约 35 个。所以,当我不实现该方法时,一定有一些代码可以计算正确的布局。我想明确地称呼它。
      • 从更多的实验来看,setionHeaderHeight(带有 sectionHeading)的值对于第 0 部分约为 45,对于所有其他部分约为 35。
      【解决方案4】:

      在覆盖heightForHeaderInSection 并进行并排比较后,第一行中标题的高度大于其余部分。这不是像素完美,但非常接近:

      - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
      {
          if (section == 0 ) {
              return 46.0;
          } else if (section == myCustomRow) {
              return 12345.0; // custom height
          } else {
              return 36.0;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 1970-01-01
        • 2013-12-27
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 2016-04-27
        相关资源
        最近更新 更多