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