简而言之:
- 苹果没有设置
frame
or bounds
for a CAShapeLayer
自动(并且苹果尚未实现等效的[UIView sizeThatFits]
)
- 如果您使用路径边界框的大小设置框架......一切都会出错。无论你如何尝试设置它,它都会搞砸路径
那么,以编程方式设置新创建的框架的正确方法是什么?CAShapeLayer
与新添加的CGPath
?苹果的文档对此事保持沉默。
我尝试过但不起作用的事情:
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层中
- 检查图层的
frame
- it's {{0,0},{0,0}}
- Set:
layer.frame = CGPathGetBoundingBox( layer.path )
框架现在是正确的,但路径现在是双偏移 - 更改frame
导致路径有效地移动额外(x,y)
pixels
Set: layer.bounds = CGPathGetBoundingBox( layer.path )
- ……一切都变得疯狂。一切都不再有意义了
- 尝试通过以下方式修复它
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ...没有骰子;还是疯了。
我尝试过的一件事确实有效,但在其他地方引起了问题:
编辑:一旦您自动旋转屏幕,此操作就会中断。我的猜测:苹果的自动旋转requires控制“变换”属性。
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层中
- 检查图层的框架 - 它是
{{0,0},{0,0}}
- Set:
layer.frame = CGPathGetBoundingBox( layer.path )
- Set:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
这是可行的,但是......许多第三方代码假设CALayer
是身份。
不应该这么难!我在这里肯定做错了什么?
(我有一个建议:“每次添加路径时,手动运行一个自定义函数来将所有点移动-1 * (top-left-point.x, top-left-point.y)
“。同样,这有效 - 但它非常复杂)
将 layer.bounds 设置为路径边界是正确的做法 - 您希望使图层的局部坐标空间与路径匹配。但是您还需要设置图层的位置属性,以将其移动到其超级图层中的正确位置。
(设置 .frame 会转化为框架为您计算 .bounds 和 .position 的正确值,但它始终保持bounds.origin 不变,当路径边界具有非零原点时,这不是您想要的。)
因此,假设您没有更改锚点的通常值 (.5, .5) 并且希望将图层定位到与其超级图层的原点齐平,这样的操作应该可行:
CGRect r = CGPathGetBoundingBox(layer.path);
layer.bounds = r;
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)