13

我正在研究。并CAShapeLayer试图绘制非线性路径。我想将框架设置为CAShapeLayer。所以我可以使用CGPathGetPathBoundingBox方法从CGPathRef.

这是代码:

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 alloc]init];
arcLayer.path = path;
arcLayer.frame = CGPathGetPathBoundingBox(path);
arcLayer.bounds = CGPathGetPathBoundingBox(path);
[self.layer addSublayer:arcLayer]; ` 

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

4

4 回答 4

17

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

为了解决这个问题,您可以在将其添加为子图层之前,在超图层的坐标空间中bounds设置图层的大小和position(这是一个真正的非计算属性)。

于 2013-12-30T09:16:04.790 回答
10

以下是CALayer文档中的引用:

框架矩形是在超层坐标空间中指定的层的位置和大小。对于图层,框架矩形是从 bounds、anchorPoint 和 position 属性中的值派生的计算属性。当您为此属性分配新值时,图层会更改其位置和边界属性以匹配您指定的矩形。矩形中每个坐标的值以点为单位。

它看起来像 CAShapeLayer 在单独设置时frame它不会保留分配的 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];
于 2013-12-30T06:53:29.450 回答
0

根据我的经验,设置positionaCAShapeLayer完全足以让它显示在你想要的位置。bounds为此不需要设置。

请参阅CoreAnimationText示例代码以了解如何使用它。

于 2013-12-30T11:58:19.367 回答
0

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

于 2014-06-24T09:43:39.583 回答