【问题标题】:How to prevent CALayer from drawing background color?如何防止CALayer绘制背景颜色?
【发布时间】:2016-10-04 20:03:55
【问题描述】:

我有一个自定义 UIView,我在其中实现了几种方便的绘图方法,允许我设置特定角的角半径、绘制边框以及使用渐变而不是背景颜色。我通过覆盖drawRect(rect:CGRect) 来实现这一点。然而,尽管使用CGContextClip 将绘图剪辑到我生成的 CGPathRef,但始终绘制背景颜色以填充视图的边界。那是因为视图的图层是在调用 drawRect 之前绘制的。

除了覆盖背景颜色的设置器之外,还有其他方法可以仅绘制我在 drawRect 中指定的内容吗?我不想用 CAShapeLayer 或类似的东西来掩盖图层。应该仍然可以在图层边界之外进行子类化和绘制。

【问题讨论】:

  • 设置backgroundColor 以清除颜色并覆盖设置器。这是你唯一能做的。另请注意属性clearsContextBeforeDrawingopaque
  • 是的,我目前使用的是 backgroundColor 覆盖方法,但我想知道是否有更好的方法。好像没有。

标签: swift core-graphics


【解决方案1】:

您可以通过 CALayer 子类更改背景的绘制方式。

在你的 CALayer 子类中调用 super.draw 将导致背景被绘制。如果您省略它,则不会绘制背景。 (您还需要重写 UIView.draw 否则该方法将不会被调用)

class CustomDrawingLayer: CALayer {
  override func draw(in ctx: CGContext) {
    // super.draw(in: ctx) don't call to prevent default drawing behaviour

    // custom drawing code
  }
}

当您将视图的背景颜色更改为非透明颜色时,支持的 CALayer.isOpaque 将设置为 true,这会从图层中移除 alpha 通道,如果未绘制该不透明颜色,则背景将是纯色黑色,您可以通过覆盖变量来防止这种行为

override var isOpaque: Bool {
    get {
        return false
    }
    set {
        // you can leave this empty...
    }
}

解决该问题的一个更简单的方法是将视图的背景颜色设置为清除并根据需要在视图中绘制背景。

【讨论】:

    【解决方案2】:

    您可能会通过设置view.layer.masksToBounds = true 找到好运。

    【讨论】:

      【解决方案3】:

      将 [super drawRect:frame] 放在 drawRect: 方法的末尾是否有效?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-27
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 2021-05-25
        相关资源
        最近更新 更多