CAShapeLayer的框架和边界

我正在研究CAShapeLayer 。并尝试绘制非线性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.My的问题是,如果我没有设置边界(框架相同),那么它将不会显示我的内容或它不会显示框架内我的内容。为什么?请帮助我感谢你。

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

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

以下是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]; 

根据我的经验,设定一个CAShapeLayerposition就足以让它显示出你想要的位置。 设置bounds不是必需的。

请参阅CoreAnimationText示例代码以便使用它。

您需要设置bounds ,否则它将像anchorPoint设置为[0, 0] 。 谁想要? :d