我有一个自定义UIView,我在其中实现了几种方便的绘图方法,允许我设置特定角的角半径,绘制边框,并使用渐变而不是背景颜色。我通过覆盖drawRect(rect:CGRect)
来实现这一目标。但是,尽管使用CGContextClip
将绘图剪辑到我生成的CGPathRef,但始终会绘制背景颜色以填充视图的边界。这是因为视图的图层在调用drawRect之前绘制。
除了覆盖backgroundColor的setter之外,还有其他方法只能绘制我在drawRect中指定的内容吗?我不想用CAShapeLayer或类似的东西来掩盖图层。应该仍然可以在图层的边界之外进行子类化和绘制。
答案 0 :(得分:2)
您可以更改通过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...
}
}
问题的一个更简单的解决方案是将视图的背景颜色设置为清除并在视图中根据需要绘制背景。
答案 1 :(得分:-1)
您可以通过设置view.layer.masksToBounds = true
来找到运气。
答案 2 :(得分:-1)
将[super drawRect:frame]放在drawRect:方法的末尾吗?