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的问题是,如果我没有设置边界(框架相同),那么它将不会显示我的内容或它不会显示框架内我的内容。为什么?请帮助我感谢你。
当你修改一个CALayer
的frame
,你正在修改它的大小和位置的超级层的坐标空间。 frame
是基于对象的bounds
和position
的计算值。 在这种情况下,该层还没有超层,因此其坐标空间是无量纲的。 当你设置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];
根据我的经验,设定一个CAShapeLayer
的position
就足以让它显示出你想要的位置。 设置bounds
不是必需的。
请参阅CoreAnimationText示例代码以便使用它。
您需要设置bounds
,否则它将像anchorPoint
设置为[0, 0]
。 谁想要? :d