CAShapeLayer的框架和界限

时间:2013-09-23 08:53:01

标签: ios cgpath cashapelayer

我正在处理CAShapeLayer。并试图绘制非线性路径。我想将帧设置为CAShapeLayer。所以我可以使用CGPathGetPathBoundingBox方法从{{获取帧1}}。

以下是代码:

CGPathRef

请仔细参考我的代码。我已经设置了相同的框架和界限到CAShapeLayer。我的问题是如果我没有设置边界(与框架相同),那么它不会显示我的内容或它不会在框架内显示我的内容。为什么?请帮帮我。谢谢你。

4 个答案:

答案 0 :(得分:15)

当您修改frame的{​​{1}}时,您正在其超级层的坐标空间中修改其大小和位置。 CALayer是基于对象framebounds的计算值。在这种情况下,该层还没有超层,因此其坐标空间是无量纲的。设置position时,大小会传递到frame属性,但由于无量纲空间中的任何点都为零,因此位置将保持为零而不是您想要的位置。

要解决此问题,您可以设置bounds以设置图层的大小,并将bounds(这是一个真正的非计算属性)设置在超级图层的坐标空间中,然后再将其添加为子层。

答案 1 :(得分:8)

以下是CALayer文档的引用:

  

框架矩形是超层坐标空间中指定的图层的位置和大小。对于图层,框架矩形是一个计算属性,它是从bounds,anchorPoint和position属性中的值派生而来的。为此属性指定新值时,图层会更改其位置和边界属性以匹配您指定的矩形。矩形中每个坐标的值以磅为单位进行测量。

在设置frame时,如果使用CAShapeLayer,它不会保留指定CGRect的原始值,只保留大小。设置bounds时,保留原点,因此显示在正确的位置。您还需要将位置值设置为要显示形状的中心点:

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO);
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES);
CGPathCloseSubpath(path);
CAShapeLayer* arcLayer = [CAShapeLayer layer];
arcLayer.path = path;
CGRect pathRect = CGPathGetPathBoundingBox(path);
arcLayer.bounds = pathRect;
arcLayer.position = CGPointMake(CGRectGetMidX(pathRect), CGRectGetMidY(pathRect));
[self.layer addSublayer:arcLayer];

答案 2 :(得分:0)

根据我的经验,设置position的{​​{1}}完全足以让它显示在您想要的位置。此处不需要设置CAShapeLayer

请参阅CoreAnimationText示例代码以便以这种方式使用它。

答案 3 :(得分:0)

您需要设置bounds,否则它的行为就像anchorPoint设置为[0, 0]一样。谁想要那个? :d