CALayer
对象有一个属性accessibilityPath
,如所述
返回屏幕坐标中元素的路径。
当然,正如预期的那样,这不会返回图层的路径。
有没有办法访问已经创建的给定CALayer
的物理路径?例如,一旦按钮初始化,你将如何获取UIButton
的图层属性的路径?
编辑
作为参考,我试图检测旋转的按钮是否包含一个点。造成这种困难的原因是由于按钮是以曲面视图绘制的...
我最初的方法是创建贝塞尔切片,然后将它们作为属性传递给按钮,以检查路径是否包含该点。无论出于何种原因,路径和按钮似乎都有一个难看的偏移。
它们都被添加到同一视图并使用相同的坐标/值来确定它们的框架,但是注册的路径似乎从路径的实际绘制形状向左偏移。下面是我绘制的形状的图像。绿色轮廓是绘制(并显示......)路径的位置,其中红色大约是在路径内部注册的区域...
我很难理解注册区域的不同之处。
如果有人对为什么会发生这种偏移有任何想法将是最受欢迎的。
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;
你完全误解了这个属性,这是辅助技术,来自文档:
摘抄:
“此属性的默认值为nil。如果未设置路径,则使用辅助功能框架矩形突出显示该元素。
为此属性指定值时,辅助技术使用您指定的路径对象(除了可访问性框架,而不是代替它)以突出显示该元素。“
您只能从CAShapeLayer获取路径,所有其他CALayers根本不需要使用路径绘制。
更新到您的更新:
我认为偏移是由于缺失
UIView convert(_ point: CGPoint, to view: UIView?)
该点需要转换为按钮坐标系。