设置新创建的CAShapeLayer的正确框架

时间:2011-12-29 00:05:22

标签: calayer cgpath cashapelayer

简而言之:

  1. Apple不会自动为frame设置boundsCAShapeLayer(并且Apple未实现等效的[UIView sizeThatFits]
  2. 如果使用路径边界框的大小设置框架......一切都会出错。无论你如何设置它,它都会搞砸道路
  3. 那么,使用新添加的CAShapeLayer以编程方式设置新创建的CGPath的框架的正确方法是什么? Apple的文档对此事保持沉默。

    我尝试的事情,不起作用:

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

    6. 设置:layer.bounds = CGPathGetBoundingBox( layer.path )

    7. ......一切都疯了。没有任何意义了
    8. 尝试layer.position = CGPathGetBoundingBox( layer.path ).origin
    9. 进行修复
    10. ......没有骰子;还是坚果。
    11. 我尝试过DID的一件事,但在其他地方引起了问题:

      编辑:一旦您自动旋转屏幕,这个BREAKS。我的猜测: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
      6. 这很有效,但是......许多第三方代码假定CALayer的初始变换是Identity。

        不应该这么困难!当然,我在这里做错了什么?

        (我有一个建议:"每次添加路径时,请手动运行自定义函数,将所有点移动-1 * (top-left-point.x, top-left-point.y)"。再次,这有效 - 但它太复杂了)

1 个答案:

答案 0 :(得分:5)

将layer.bounds设置为路径边界是正确的做法 - 您希望使图层的局部坐标空间与路径匹配。但是,您还需要设置图层的position属性,以将其移动到其超级图层中的正确位置。

(设置.frame会转换为为你计算正确的.bounds和.position值的框架,但它始终保持bounds.origin不受影响,当你的路径边界具有非零原点时,这不是你想要的。 )

所以类似这样的东西应该可以工作,假设你没有从通常的(.5,.5)值改变anchorPoint,并希望将层刷新定位到其超级层的原点:

CGRect r = CGPathGetBoundingBox(layer.path);
layer.bounds = r;
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5);