我正在处理CAShapeLayer
。并试图绘制非线性路径。我想将帧设置为CAShapeLayer
。所以我可以使用CGPathGetPathBoundingBox
方法从{{获取帧1}}。
以下是代码:
CGPathRef
请仔细参考我的代码。我已经设置了相同的框架和界限到CAShapeLayer。我的问题是如果我没有设置边界(与框架相同),那么它不会显示我的内容或它不会在框架内显示我的内容。为什么?请帮帮我。谢谢你。
答案 0 :(得分:15)
当您修改frame
的{{1}}时,您正在其超级层的坐标空间中修改其大小和位置。 CALayer
是基于对象frame
和bounds
的计算值。在这种情况下,该层还没有超层,因此其坐标空间是无量纲的。设置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