当前位置: 首页 > 知识库问答 >
问题:

为什么CGContext不能在iOS 14上的UITableViewCell中工作?

蒋硕
2023-03-14

绘制线条在iOS14上不起作用。

我创建了UITableViewCell的子类。

我想在自定义单元格中画两条线。

代码在下面。

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

        guard let context = UIGraphicsGetCurrentContext() else { return }

        context.saveGState() // Save state. This includes transformations and clips

        context.setLineWidth(7.0)
        
//        let lineColor = UIColor(hex: "FC5622")!
//        let bgColor = UIColor(hex: "E8E6EB")!
//
        let lineColor = UIColor.red
        let bgColor = UIColor.lightGray

        context.setStrokeColor(bgColor.cgColor)
        context.move(to: CGPoint(x: 76.0, y: 32))
        context.addLine(to: CGPoint(x: (76.0 + 120.0), y: 32))
        context.setLineCap(.round)
        context.strokePath()

        context.setLineWidth(7.0)
        context.setStrokeColor(lineColor.cgColor)
        context.move(to: CGPoint(x: 76.0, y: 32))
        context.addLine(to: CGPoint(x: (76.0 + 120.0 * self.lineScale ), y: 32))
        context.setLineCap(.round)
        context.strokePath()

        context.restoreGState() // Put back state. This includes transformations and clips
    }

它在iOS 12上运行良好。它在iOS 14上不起作用。(不知道在iOS 13上是否管用)。

我不知道我能做些什么来解决这个问题。

你知道原因吗?你能修好它吗?

共有2个答案

程亦
2023-03-14

不应该重写表格单元格的绘图(_rect:CGRect)。相反,创建一个新的自定义视图并将其添加到单元格的contentView中,然后在其中绘制。

您应该创建UIView并将其作为contentView属性的子视图添加。关于DrawRect:UITableViewCell,这里和整个web上有很多问题/答案,其中大多数建议您不要这样做。

终祯
2023-03-14

您不应该试图重写表格视图单元格的draw(_rect:CGRect)。单元格有子视图,子视图有子视图,单元格本身做的不仅仅是“存在”。

如果您使用debug View hierarchy,您就会看到哪里出了问题,这将进一步说明这是个坏主意的原因。

使用IOS14时,单元格结构发生了变化,您应该只操作单元格的.contentView,而不是单元格本身。

更好的做法是将其作为一个自定义视图添加到内容视图中。

 类似资料:
  • 我有以下Sikuli代码在JMeter这是不工作。 我尝试了Beanshell采样器和JSR223采样器,但在这两种情况下都不起作用。这是我得到的错误。 JSR223采样器 响应消息:javax。剧本脚本异常:javax。剧本ScriptException:FindFailed:C:\scripts\patterns\vnc\vncviewer。png:(32x31)在R[0,0 1920x108

  • 在我的项目中,电影和演员、电影和类别之间有着多对多的关系。当我尝试创建一部电影,然后尝试使用Select2添加演员和类别时,它不会列出可用的选项(输入字段看起来是灰色的,好像它们被锁定了)。我查看脚本是否正在加载,它们是否正在加载。这是我的密码。

  • 因此,我正在运行一个脚本,该脚本调用: 在ubuntu上运行时似乎工作良好,但当我使用Git Bash在Windows上运行时,会出现以下错误:

  • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?

  • 问题内容: 从上一个私有方法春天在什么@Transactional属性的工作? 使用代理时,应仅将@Transactional注释应用于具有公共可见性的方法。如果使用@Transactional注释对受保护的,私有的或程序包可见的方法进行注释,则不会引发任何错误,但是带注释的方法不会显示已配置的事务设置。 我可以想到排除和方法的充分理由,但是为什么方法不能在事务上表现呢?以下堆栈跟踪显示了公共方法

  • 我可以想出排除和方法的充分理由,但为什么方法不会以事务性方式运行呢?以下stacktrace显示了公共方法(通过接口代理调用)的正确行为: 当调用一个“完全相同”的受保护方法(通过非接口CGLIB代理)时,我们得到如下结果: 这显然是一个设计决定(为什么?),但我认为它很值得怀疑的是,当它显然是开发人员的错误时,它却无声无息地失败了。 编辑这显然不是使用接口(只是接口中的公共方法)时的问题,但由于