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