在自定义 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 中确定触摸的项目
Swift:在自定义视图中未调用 UIButton 触摸事件