2

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"
}

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

具有空类实现的节标题视图


2. 覆盖的自定义视图实现drawRect(_:)

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

class MyCustomHeaderView: UITableViewHeaderFooterView {

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

}

同样,除了调用实现之外,我在此方法中什么也不做super。所以从我的角度来看,这不应该改变任何东西,因为如果我不实现它,super无论如何都会调用实现。

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

具有覆盖 drawRect(_:) 方法的剖面视图标题

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


为什么?


附加信息:

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

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

(从屏幕截图中可以看出,我在一个全新的项目中进行了尝试,特别是使用默认的 Xcode 主从模板,以排除我的自定义表格视图可能导致这种情况的可能性。)

调试视图层次结构

不透明:开

4

1 回答 1

3

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

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

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

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

于 2017-04-20T20:40:13.213 回答