覆盖UITableViewHeaderFooterView中的drawRect(_ :)导致黑色背景

时间:2017-04-20 20:27:35

标签: ios uitableview override drawrect uitableviewsectionheader

1。空自定义视图实现

我创建了UITableViewHeaderFooterView子类,如下所示:

class MyCustomHeaderView: UITableViewHeaderFooterView {

}

我用表视图注册了该类:

tableView.register(MyCustomHeaderView.self, forHeaderFooterViewReuseIdentifier: "myHeaderView")

并实现了如下数据源函数:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "myHeaderView")
    return headerView
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "Hello"
}

正如预期的那样,这就是我得到的:一个看起来就像系统默认的标题视图。

Section Header View with empty class implementation

2。覆盖drawRect(_:)

的自定义视图实现

现在我首先实现这个子类的原因是因为我想执行一些自定义绘图。因此,我实现了drawRect(_:)方法:

class MyCustomHeaderView: UITableViewHeaderFooterView {

    override func draw(_ rect: CGRect) {
        super.draw(rect)
    }

}

除了调用super实现之外,我在此方法中不做任何事情。所以从我的观点来看,这不应该改变任何东西,因为如果我不实现它,无论如何都会调用super实现。

然而,当我现在启动应用程序时,这就是我得到的:

Section view header with overridden drawRect(_:) method

标题视图的背景完全填充了纯黑色。

为什么?

其他信息:

我做了一些研究,并阅读了几篇建议将标题视图的isOpaque属性设置为false的帖子。我这样做了,我甚至为标题视图backgroundViewcontentView设置了它 - 没有效果。

但是,我在Xcode的Debug View Hierarchy中检查了它实际上MyCustomHeaderView本身是黑色的,而不是它的子视图,而且 的视图实际上是不透明 - 即使我在代码中明确地将其设置为false

(正如您从屏幕截图中看到的,我尝试使用一个全新的项目,特别是使用默认的Xcode主 - 详细信息模板,以排除我的自定义表视图可能导致此问题的可能性。)

Debug View Hierarchy

Opaque: On

1 个答案:

答案 0 :(得分:3)

当您覆盖视图的drawRect函数时,您承诺用自定义行为替换它的正常绘制行为。

系统通常在调用drawRect之前清除绘图上下文。如果你让你的视图变得不透明,那么它会让你的视图有机会画出下面的内容。如果你不画画,你会在视图的框架上看到一个黑框。

我建议以更简单的自定义视图作为起点。创建UILabel的自定义子类,并将其添加到单个视图应用程序中。请注意,除非您实现draw(_rect:),否则它会像普通标签一样绘制自己。如果实现空draw(_rect:),则不再绘制标签。使视图不透明,你会得到一个黑盒子。

除非您要提供自定义实现,否则不要覆盖drawRect。