转换一个描边的 CAShapeLayer

Posted

技术标签:

【中文标题】转换一个描边的 CAShapeLayer【英文标题】:Transforming a Stroked CAShapeLayer 【发布时间】:2012-12-25 19:46:54 【问题描述】:

我有一个CAShapeLayer,其中包含一个CGMutablePath,它周围画了一个笔划。在我的应用程序中,我将这个CAShapeLayer 转换为在特定时间增加/减小它的大小。我注意到当我转换CAShapeLayer 时,stroke 也被转换了。理想情况下,即使CAShapeLayers 发生转换,我也希望始终将strokelineWidth 保持为3。

我尝试在转换之前关闭笔画,然后再读取它,但它不起作用:

subLayerShapeLayer.lineWidth = 0;
subLayerShapeLayer.strokeColor = nil;
self.layer.sublayerTransform = CATransform3DScale(self.layer.sublayerTransform, graphicSize.width / self.graphic.size.width, graphicSize.height / self.graphic.size.height, 1);
shapeLayer.strokeColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1].CGColor;;
shapeLayer.lineWidth = 3;

有谁知道我如何能够完成这项任务?似乎它应该能够在以某种方式转换后重新绘制笔画。

【问题讨论】:

【参考方案1】:

转换 CGPath 本身,而不是其绘制的表示(CAShapeLayer)。

仔细看看CGPathCreateMutableCopyByTransformingPath - CGPath Reference

CGPathCreateMutableCopyByTransformingPath

创建由 a 转换的图形路径的可变副本 变换矩阵。

CGMutablePathRef CGPathCreateMutableCopyByTransformingPath(
   CGPathRef path,
   const CGAffineTransform *transform
);

参数

path要复制的路径。

transform 指向仿射变换矩阵的指针,如果不需要变换,则为 NULL。如果指定,Quartz 将转换应用于新路径的所有元素。 返回值 由 transform 参数转换的指定路径的新的可变副本。你有责任释放这个对象。

可用性 在 ios 5.0 及更高版本中可用。 宣布于 CGPath.h

【讨论】:

感谢您的回复。如果我只是在每次转换时替换它的路径,这不会带走使用 CAShapeLayer 的一些好处吗?会不会和只在drawRect中画到上下文一样吗? 很抱歉,目前我手头没有更好的解决方案 - 我不知道任何其他方法可以达到这种效果。

以上是关于转换一个描边的 CAShapeLayer的主要内容,如果未能解决你的问题,请参考以下文章

[WPF] 如何实现文字描边

快速将 CAShapelayer 转换为特定大小

如何将 CAShapeLayer 转换为 CAGradientLayer?

带描边的 SVG 蒙版

关于Unity中的模型描边与Shader切换(专题二)

关于ios下字体描边的一个细节