ios - 重写drawRect(_ :) in UITableViewHeaderFooterView results in black background

标签 ios uitableview overriding drawrect uitableviewsectionheader

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 。

Section Header View with empty class implementation


2。覆盖 drawRect(_:) 的自定义 View 实现

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

class MyCustomHeaderView: UITableViewHeaderFooterView {

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

}

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

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

Section view header with overridden drawRect(_:) method

标题 View 的背景完全填充为纯黑色。


为什么?


其他信息:

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

但是,我检查了 Xcode 中的调试 View 层次结构,它实际上是 MyCustomHeaderView它本身是黑色的,而不是它的 subview ,并且该 View 实际上不透明 - 即使我明确将其设置为 false在代码中。

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

Debug View Hierarchy

Opaque: On

最佳答案

当您重写 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/

相关文章:

c# - 可选参数: reversed precedence if override of overload exists

extjs - Pimcore Extjs 如何覆盖不同插件中的相同方法

c++ - 功能覆盖在哪里完成?

ios - UIButton 按下不会调用函数

objective-c - iPad 应用程序在屏幕解锁后以纵向方向出现,无论屏幕 sleep 方向如何

ios - 如何在 iOS info.plist 文件中本地化字符串数组

ios - 如何在 ios 中设置 tableView 单元格标题?

ios - 从解析查询获取 tableView 中的值的延迟

ios - 如何将应用程序移动到后台并在 selenium 中的同一驱动程序上打开另一个应用程序

ios - contentView 不在 iOS 6 UITableViewCell 原型(prototype)单元格中缩进