在自定义 UIControl 对象中定义自定义触摸区域

Posted

技术标签:

【中文标题】在自定义 UIControl 对象中定义自定义触摸区域【英文标题】:Define custom touch area in custom UIControl object 【发布时间】:2014-02-27 16:00:17 【问题描述】:

我正在创建一个自定义 UIControl 对象,详细说明 here。除了触摸区域外,一切都运行良好。

我想找到一种方法将触摸区域限制在控件的一部分,在上面的示例中,我希望它只限制在黑色圆周上,而不是整个控件区域。

有什么想法吗? 干杯

【问题讨论】:

What have you tried so far?(我们不是来做所有的工作 - 您至少需要在阅读相关文档后尝试自己解决这个问题。) 我发现这个b2cloud.com.au/tutorial/ios-view-hit-regions 可能会完成您感兴趣的工作。 【参考方案1】:

您可以覆盖 UIView 的 pointInside:withEvent: 以拒绝不需要的触摸。

这是一个检查触摸是否发生在视图中心周围的环中的方法:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

    UITouch *touch = [[event touchesForView:self] anyObject];
    if (touch == nil)
        return NO;

    CGPoint touchPoint = [touch locationInView:self];
    CGRect bounds = self.bounds;

    CGPoint center =  CGRectGetMidX(bounds), CGRectGetMidY(bounds) ;
    CGVector delta =  touchPoint.x - center.x, touchPoint.y - center.y ;
    CGFloat squareDistance = delta.dx * delta.dx + delta.dy * delta.dy;

    CGFloat outerRadius = bounds.size.width * 0.5;

    if (squareDistance > outerRadius * outerRadius)
        return NO;

    CGFloat innerRadius = outerRadius * 0.5;

    if (squareDistance < innerRadius * innerRadius)
        return NO;

    return YES;

要检测更复杂形状上的其他匹配,您可以使用CGPath 来描述形状并使用CGPathContainsPoint 进行测试。另一种方法是使用控件的图像并测试像素的 alpha 值。

这一切都取决于您如何构建控件。

【讨论】:

我知道这一点,但如何检测使用核心图形绘制的特定形状内的触摸。再次从我提供的示例中,我如何检测在 UIContrl 的 drawRect 中绘制的黑色弧内的交点? 好的,谢谢您的回答。这更像是一种解决方法,我非常感谢。这是一个很好的解决方案。但我想知道是否有任何其他方法可以检测与 UIControl 内容的交互。在这个例子中,区域很简单,只是一个粗圆弧。但我使用不同多边形形状的区域进行入侵。会有直接的方法来检测这些吗? @Abolfoooud 编辑回复。 "另一种方法是使用控件的图像并测试像素的 alpha 值。"这听起来是个好主意。我会试一试。谢谢

以上是关于在自定义 UIControl 对象中定义自定义触摸区域的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义 UIControl 添加触摸事件并在 swift 5 中确定触摸的项目

按钮未在自定义 UIButton 中注册触摸

自定义 UIControl,动作调用两次

Swift:在自定义视图中未调用 UIButton 触摸事件

使用 touchesMoved: 在自定义单元格中确定触摸是不是在图像上

如何让自定义 UIControl 作为推送操作参与 segue?