16

简而言之:

  1. Apple 不会自动为 a设置frameor (并且 Apple 还没有实现等效的boundsCAShapeLayer[UIView sizeThatFits]
  2. 如果您使用路径边界框的大小设置框架......一切都会出错。无论您如何尝试设置它,它都会搞砸路径

那么,以编程方式设置新创建的框架的正确方法是CAShapeLayer什么CGPath?苹果的文档对此事保持沉默。

我尝试过的东西不起作用:

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层
  3. 检查图层frame- 它是{{0,0},{0,0}}
  4. 放:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 帧现在是正确的,但路径现在是双偏移 - 更改frame导致路径有效移动额外(x,y)像素的原因

  6. 放:layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ......一切都疯了。没有任何意义了
  8. 尝试通过这样做来修复它layer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ...没有骰子; 还是疯了。

我尝试过的一件事确实有效,但在其他地方引起了问题:

编辑:一旦您自动旋转屏幕,就会中断。我的猜测:Apple 的自动旋转需要控制“转换”属性。

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层
  3. 检查图层的框架 - 它是{{0,0},{0,0}}
  4. 放:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 放: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)”。同样,这有效 - 但它非常复杂)

4

1 回答 1

5

将 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);
于 2013-12-11T16:44:19.097 回答