获得CALayer的Bezier路径

时间:2018-01-31 19:12:06

标签: ios objective-c calayer uibezierpath

CALayer个对象有一个属性accessibilityPath,如上所述

  

以屏幕坐标返回元素的路径。

当然正如预期的那样,不会返回图层的路径。

有没有办法访问已创建的给定CALayer的物理路径?例如,一旦初始化按钮,你如何获取UIButton的图层属性的路径?

修改

作为参考,我试图检测旋转的按钮是否包含一个点。这里遇到困难的原因是因为按钮是以曲线视图绘制的......

我最初的方法是创建贝塞尔切片,然后将它们作为属性传递给按钮,以检查路径是否包含该点。无论出于何种原因,路径和按钮似乎都有一个难看的偏移。

它们都被添加到同一视图并使用相同的坐标/值来确定它们的帧,但是注册的路径似乎从路径的实际绘制形状向左偏移。下面是我绘制的形状的图像。绿色轮廓是绘制(并显示....)路径的位置,其中红色大约是在内部路径中注册的区域...

enter image description here

我很难理解注册区域的差异。

如果有人对为什么有任何想法,那么将会发生这种偏移。

更新

这是我添加形状的片段。在这种情况下,self只是添加到控制器的UIView。它的帧是控制器的完整大小,是`{0,height_of_device - controllerHeight,width_of_device,controllerHeight}

UIBezierPath *slicePath = UIBezierPath.new;

[slicePath moveToPoint:self.archedCenterRef];
[slicePath addArcWithCenter:self.archedCenterRef radius:outerShapeDiameter/2 startAngle:shapeStartAngle endAngle:shapeEndAngle clockwise:clockwise];
[slicePath addArcWithCenter:self.archedCenterRef radius:(outerShapeDiameter/2 - self.rowHeight) startAngle:shapeEndAngle endAngle:shapeStartAngle clockwise:!clockwise];
[slicePath closePath];

CAShapeLayer *sliceShape = CAShapeLayer.new;
sliceShape.path = slicePath.CGPath;
sliceShape.fillColor = [UIColor colorWithWhite:0 alpha:.4].CGColor;
[self.layer addSublayer:sliceShape];

...
...

button.hitTestPath = slicePath;

在我的按钮子类中的一个单独的方法中检测它是否包含该点:( self这里是按钮当然)

...
if ([self.hitTestPath containsPoint:touchPosition]) {
    if (key.alpha > 0 && !key.isHidden) return YES;
    else return NO;
}
else return NO;

1 个答案:

答案 0 :(得分:2)

您完全误解了该属性,这是针对辅助技术,来自文档:

摘录:

“此属性的默认值为nil。如果未设置路径,则使用辅助功能框架矩形突出显示该元素。

为此属性指定值时,辅助技术使用您指定的路径对象(除了辅助功能框架,而不是代替它)以突出显示该元素。“< / p>

您只能从CAShapeLayer获取路径,所有其他CALayers根本不需要使用路径绘制。

更新到您的更新:

我认为偏移是由于缺少

UIView convert(_ point: CGPoint, to view: UIView?)

该点需要转换为按钮坐标系。