简而言之:
- Apple 不会自动为 a设置
frame
or (并且 Apple 还没有实现等效的bounds
CAShapeLayer
[UIView sizeThatFits]
- 如果您使用路径边界框的大小设置框架......一切都会出错。无论您如何尝试设置它,它都会搞砸路径
那么,以编程方式设置新创建的框架的正确方法是CAShapeLayer
什么CGPath
?苹果的文档对此事保持沉默。
我尝试过的东西不起作用:
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层
frame
- 它是{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
帧现在是正确的,但路径现在是双偏移 - 更改
frame
导致路径有效移动额外(x,y)
像素的原因放:
layer.bounds = CGPathGetBoundingBox( layer.path )
- ......一切都疯了。没有任何意义了
- 尝试通过这样做来修复它
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ...没有骰子; 还是疯了。
我尝试过的一件事确实有效,但在其他地方引起了问题:
编辑:一旦您自动旋转屏幕,就会中断。我的猜测:Apple 的自动旋转需要控制“转换”属性。
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层的框架 - 它是
{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
- 放:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
这可行,但是......许多第 3 方代码假定 a 的初始转换CALayer
是身份。
不应该这么难!当然,我在这里做错了什么?
(我有一个建议:“每次添加路径时,手动运行自定义函数以将所有点移动-1 * (top-left-point.x, top-left-point.y)
”。同样,这有效 - 但它非常复杂)