关于swift:如何防止CALayer绘制背景颜色?

How to prevent CALayer from drawing background color?

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

除了覆盖backgroundColor的设置方法外,还有其他方法只能绘制我在drawRect中指定的内容吗? 我不想用CAShapeLayer或类似的东西遮盖该层。 仍然可以继承和绘制图层边界之外的内容。


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

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

1
2
3
4
5
6
7
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通道,如果未绘制不透明的颜色,则背景将为纯黑色,您 可以通过覆盖变量来防止此行为

1
2
3
4
5
6
7
8
override var isOpaque: Bool {
    get {
        return false
    }
    set {
        // you can leave this empty...
    }
}

解决该问题的一种更简单的方法是将视图的背景色设置为可清除并在视图中绘制背景。


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


设置view.layer.masksToBounds = true可能会带来好运。