为UITableView节头返回CGFloat.leastNormalMagnitude会导致崩溃

时间:2017-02-15 10:03:19

标签: ios swift uitableview ios9 ios10

我为iOS 8制作了一个应用程序,它为其中一个页面使用了分组UITableView。其中有多个部分使用CGFloat.leastNormalMagnitude(或Swift 2及更低版本中的CGFloat.min)部分页眉和页脚高度来删除"默认"空间。一切顺利,直到应用程序在iOS 9和10中运行,它崩溃时出现此错误:

  

由于未捕获的异常终止应用' NSInternalInconsistencyException',原因:'部分标题高度不得为负数 - 为第0部分提供的高度为-0.00000'

不知何故,1下的任何值(舍入的0除外)都被视为否定 - 并且使用1作为返回值将使页眉/页脚空间再次出现。< / p>

有解决方法吗?

提前致谢。

5 个答案:

答案 0 :(得分:19)

我为tableView(_:heightForHeaderInSection:)尝试了几个值,并发现:

  • leastNormalMagnitudeleastNonzeroMagnitude将被视为减号(因此崩溃)。
  • Zero将使TableView返回默认高度作为页眉/页脚。
  • 零和一之间的任何内容都将被视为减号。
  • 将使TableView返回默认高度。
  • 任何多于一个(例如1.1)都会将页眉/页脚设置为实际高度。

我最终使用1.1解决了我的问题。

希望这会帮助那里的人!

答案 1 :(得分:3)

我们已经在运行Xcode 10.2的Swift 5上在iOS 9上运行了相同的体验。事实证明,如果您在estimateHeightForHeaderInSection / estimatedHeightForFooterInSection中返回CGFloat.leastNormalMagnitude或CGFloat.leastNonzeroMagnitude,它将在iOS 9设备上崩溃。

您仍然可以在heightForHeaderInSection / heightForFooterInSection中返回MinimumNormalMagnitude或MinimumNonzeroMagnitude。

如上面的edopelawi所指出的,任何小于1的值都将被视为负值,而1将被视为默认的分组节页眉/页脚高度。如果设备运行的是iOS 10或更低版本,我们最终返回1.000001作为估计高度:


func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    if #available(iOS 11.0, *) {
        return self.tableView(tableView, heightForHeaderInSection: section)
    } else {
        return max(1.000001, self.tableView(tableView, heightForHeaderInSection: section))
    }
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 10
    }
    return CGFloat.leastNonzeroMagnitude
}

答案 2 :(得分:0)

如果我将节标题高度设置为:

,则会出现同样的问题
tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = CGFloat.leastNormalMagnitude

但是如果我将我的Controller设置为我的表视图的委托(UITableViewDelegate)并实现:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

然后它起作用

答案 3 :(得分:0)

也许CGFloat.leastNonzeroMagnitude就是你所需要的!

答案 4 :(得分:0)

如果实现viewForHeader和viewForFooter,则无需作弊。

例如,当我要隐藏页眉和/或页脚时,我个人返回0.1f。 此示例将完全隐藏页眉和页脚,不填充任何空间,您可以在其中添加自定义逻辑。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.1f;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.1f;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
     return nil;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
}