1。空自定义 View 实现
我创建了 UITableViewHeaderFooterView
的空子类如下:
class MyCustomHeaderView: UITableViewHeaderFooterView {
}
我用我的表格 View 注册了该类:
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"
}
正如预期的那样,这就是我得到的:一个看起来像系统默认值的标题 View 。
2。覆盖 drawRect(_:)
的自定义 View 实现
现在我首先实现这个子类的原因是因为我想执行一些自定义绘图。因此,我实现了drawRect(_:)
方法:
class MyCustomHeaderView: UITableViewHeaderFooterView {
override func draw(_ rect: CGRect) {
super.draw(rect)
}
}
除了调用 super
之外,我在这个方法中什么也不做。执行。所以从我的角度来看,这不应该改变任何东西,因为如果我不实现它 super
无论如何都会调用实现。
但是,当我现在启动应用程序时,我得到的是:
标题 View 的背景完全填充为纯黑色。
为什么?
其他信息:
我做了一些研究并阅读了几篇建议设置标题 View 的 isOpaque
的帖子属性至false
。我这样做了,甚至将其设置为标题 View 的 backgroundView
和contentView
- 没有效果。
但是,我检查了 Xcode 中的调试 View 层次结构,它实际上是 MyCustomHeaderView
它本身是黑色的,而不是它的 subview ,并且该 View 实际上不透明 - 即使我明确将其设置为 false
在代码中。
(正如您从屏幕截图中看到的,我在一个全新的项目中尝试了此操作,特别是使用默认的 Xcode 主从模板,以排除我的自定义表格 View 可能导致此问题的可能性。)嗯>
最佳答案
当您重写 View 的drawRect函数时,您就 promise 用自定义行为替换它的正常绘制行为。
系统通常会在调用drawRect之前清除绘图上下文。如果你让你的 View 不透明,那么它会在给你的 View 提供绘制机会之前删除下面的内容。如果您不绘制,您最终会在 View 框架处看到一个黑框。
我建议从一个更简单的自定义 View 开始。创建 UILabel 的自定义子类并将其添加到单个 View 应用程序中。请注意,除非您实现 draw(_rect:)
,否则它会像普通标签一样绘制自身。如果您实现空 draw(_rect:)
,则不再绘制标签。使 View 不透明,你会在它的位置看到一个黑框。
除非您要提供自定义实现,否则不要重写drawRect。
关于ios - 重写drawRect(_ :) in UITableViewHeaderFooterView results in black background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43529295/