获得CALayer的Bezier路径

问题描述 投票:0回答:1

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

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

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

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

编辑

作为参考,我试图检测旋转的按钮是否包含一个点。造成这种困难的原因是由于按钮是以曲面视图绘制的...

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

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

enter image description here

我很难理解注册区域的不同之处。

如果有人对为什么会发生这种偏移有任何想法将是最受欢迎的。

UPDATE

这是我添加形状的片段。在这种情况下,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;
ios objective-c calayer uibezierpath
1个回答
2
投票

你完全误解了这个属性,这是辅助技术,来自文档:

摘抄:

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

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

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

更新到您的更新:

我认为偏移是由于缺失

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

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

© www.soinside.com 2019 - 2024. All rights reserved.