我创建了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"
}
正如预期的那样,这就是我得到的:一个看起来就像系统默认的标题视图。
drawRect(_:)
现在我首先实现这个子类的原因是因为我想执行一些自定义绘图。因此,我实现了drawRect(_:)
方法:
class MyCustomHeaderView: UITableViewHeaderFooterView {
override func draw(_ rect: CGRect) {
super.draw(rect)
}
}
除了调用super
实现之外,我在此方法中不做任何事情。所以从我的观点来看,这不应该改变任何东西,因为如果我不实现它,无论如何都会调用super
实现。
然而,当我现在启动应用程序时,这就是我得到的:
标题视图的背景完全填充了纯黑色。
我做了一些研究,并阅读了几篇建议将标题视图的isOpaque
属性设置为false
的帖子。我这样做了,我甚至为标题视图backgroundView
和contentView
设置了它 - 没有效果。
但是,我在Xcode的Debug View Hierarchy中检查了它实际上MyCustomHeaderView
本身是黑色的,而不是它的子视图,而且 的视图实际上是不透明 - 即使我在代码中明确地将其设置为false
。
(正如您从屏幕截图中看到的,我尝试使用一个全新的项目,特别是使用默认的Xcode主 - 详细信息模板,以排除我的自定义表视图可能导致此问题的可能性。)
答案 0 :(得分:3)
当您覆盖视图的drawRect函数时,您承诺用自定义行为替换它的正常绘制行为。
系统通常在调用drawRect之前清除绘图上下文。如果你让你的视图变得不透明,那么它会让你的视图有机会画出下面的内容。如果你不画画,你会在视图的框架上看到一个黑框。
我建议以更简单的自定义视图作为起点。创建UILabel的自定义子类,并将其添加到单个视图应用程序中。请注意,除非您实现draw(_rect:)
,否则它会像普通标签一样绘制自己。如果实现空draw(_rect:)
,则不再绘制标签。使视图不透明,你会得到一个黑盒子。
除非您要提供自定义实现,否则不要覆盖drawRect。