【问题标题】:UIBezierPath not cleared on redraw重绘时未清除 UIBezierPath
【发布时间】:2019-03-05 12:36:15
【问题描述】:

我有自定义UIView,我在其中绘制了一个 UIBezierPath。此视图用于 UITableViewCell。所以当我滚动时,自定义视图的贝塞尔路径会被重绘。问题是新路径会覆盖旧路径图(上下文未正确清除)。我在表格单元格获取上调用setNeedsDisplay(),并且我还为视图设置了clearsContextBeforeDrawing = true。清除旧绘图的唯一方法是调用context.clear(rect),但这一点都不理想,因为我失去了背景(它变成了黑色)。

关于如何解决这个问题的任何想法?

class CustomView: UIView {

var percentage: CGFloat = 0 {
    didSet {
        setNeedsDisplay()
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    clearsContextBeforeDrawing = true
    contentMode = .redraw
    clipsToBounds = false
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

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

    // NOTE: don't really like doing this
    let context = UIGraphicsGetCurrentContext()!
    context.clear(rect)

    let center = CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/2)

    let path = UIBezierPath(arcCenter: center,
                            radius: self.bounds.size.width/2-10,
                            startAngle: 0.5 * .pi,
                            endAngle: (-2.0 * self.percentage + 0.5) * .pi,
                            clockwise: false)

    path.lineWidth = 4
    UIColor.red.setStroke()
    path.stroke()
}
}

这是我的单元格和自定义 uiview 设置的位置。

override func tableView(_ tableView: UITableView, cellForItemAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        let num = list[indexPath.item]
        let percentage = CGFloat(num) / 10
        cell.customView.percentage = percentage // Custom view should get redrawn after this call
        return cell
    }

【问题讨论】:

  • “如果需要我可以提供代码”显然是。
  • 更新了帖子
  • 好的,现在的问题好多了,谢谢
  • 在画路径之前画背景怎么样? UIColor.white.setFill(); context.fill(rect); // context.clear(rect)
  • 顺便说一句:“但这一点都不理想,因为我失去了背景(它变成了黑色)。”你可以通过在init 中说self.backgroundColor = .clear 来解决这个问题。

标签: ios uitableview core-graphics uibezierpath drawrect


【解决方案1】:

我认为问题仅仅是你的绘图很大并且偏离了单元格,因为你的视图没有剪辑到边界。那是不连贯的。每个单元格只需要绘制自己的内容。

换句话说,您看到的重叠与自定义视图绘制无关;它与 cell 绘图有关。你正在用你的图画感染相邻的细胞。

顺便说一句,你说:

但这一点都不理想,因为我失去了背景(它变成了黑色)。”

您可以通过在 init 中输入 self.backgroundColor = .clear 来解决此问题。

【讨论】:

  • 你能给我指出你书中关于backgroundColor = .clear的部分/页面吗?谢谢。
  • 首先查看“视图,黑色背景”下的索引,它会带您进入第 2 章“绘图”的讨论。然后阅读第 2 章绘图的擦除部分。
  • 知道了。问题,当重绘发生时,之前的绘图会进入背景吗?当我设置backgroundColor = .clear 时,黑色背景和之前的绘图消失了。
  • 正如我所说,我无法重现上一张图纸没有消失的问题。 draw 总是从头开始。这就是为什么在我的回答中,我建议问题是由单元格的绘制而不是自定义视图引起的。
  • 我明白了。您是否剪辑到单元格、自定义视图或两者的边界?
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多