Ios 向CAGradientLayer添加遮罩会使UIBezierPath消失

Ios 向CAGradientLayer添加遮罩会使UIBezierPath消失,ios,swift,uibezierpath,cashapelayer,cagradientlayer,Ios,Swift,Uibezierpath,Cashapelayer,Cagradientlayer,我想向具有渐变的视图添加一个内边框。下面的代码起作用并给出了这个结果 你会注意到边缘看起来不太好。为了解决这个问题,我给了边缘一个角度。当我将遮罩应用于此角度的渐变时,右侧和底部路径消失如下: 我在这里所做的就是使用一些封闭的Bezier路径并对它们应用梯度。如果渐变具有掩码(注释代码未注释),则其中两条路径将消失。我有一种感觉,我不理解一些东西,所以希望这里有人能告诉我如何正确使用CAShapeLayer。 很好地解释了这一点: 遮罩层位于遮罩层的坐标系中,就像它是一个子层一样 在您的例子

我想向具有渐变的视图添加一个内边框。下面的代码起作用并给出了这个结果

你会注意到边缘看起来不太好。为了解决这个问题,我给了边缘一个角度。当我将遮罩应用于此角度的渐变时,右侧和底部路径消失如下:

我在这里所做的就是使用一些封闭的Bezier路径并对它们应用梯度。如果渐变具有掩码(注释代码未注释),则其中两条路径将消失。我有一种感觉,我不理解一些东西,所以希望这里有人能告诉我如何正确使用CAShapeLayer。

很好地解释了这一点:

遮罩层位于遮罩层的坐标系中,就像它是一个子层一样

在您的例子中,右侧和底部渐变层的原点不是 在封闭视图的
(0,0)
,但在
(frame.width-width,0)
(frame.height-width,0)
。 另一方面,图中各点的坐标 o
shapeMask.path
相对于封闭视图的
(0,0)

一个可能的简单解决方法是变换 形状层,使其使用与点相同的坐标 给定路径的路径:

    let gradient = CAGradientLayer()
    gradient.frame = path.bounds
    gradient.bounds = path.bounds // <<--- ADDED HERE!
    gradient.colors = [color.cgColor, UIColor.clear.cgColor]
    gradient.startPoint = gradientPoints[0]
    gradient.endPoint = gradientPoints[1]

    let shapeMask = CAShapeLayer()
    shapeMask.path = path.cgPath
    gradient.mask = shapeMask

    self.layer.addSublayer(gradient)
let gradient=CAGradientLayer()
gradient.frame=path.bounds

gradient.bounds=path.bounds//我不明白为什么要从
draw
方法内部将
CAGradientLayer
添加到视图的
——我觉得这不对。你能解释一下你想要达到的目标吗?我要添加的是可调整大小的。由于无论何时需要绘制或重画视图,都会调用
draw
方法,因此我想我应该在那里完成工作。您是否考虑了更好的实现?是的,
layoutSubviews
或其他地方。您应该只覆盖
draw
以实际执行渲染,而不是更改图层层次结构。由于您是通过
draw
调用插入层的,并且从未删除我所看到的层,因此您最终将得到数百层,不是吗?我真的很难理解你想要实现什么…我明白你的意思。不知道我在想什么。让我对代码进行检查,我会用更有意义的代码更新我的问题。谢谢您的回复。这解决了问题。非常感谢。
    let gradient = CAGradientLayer()
    gradient.frame = path.bounds
    gradient.bounds = path.bounds // <<--- ADDED HERE!
    gradient.colors = [color.cgColor, UIColor.clear.cgColor]
    gradient.startPoint = gradientPoints[0]
    gradient.endPoint = gradientPoints[1]

    let shapeMask = CAShapeLayer()
    shapeMask.path = path.cgPath
    gradient.mask = shapeMask

    self.layer.addSublayer(gradient)