如何检测圆形视图内的触摸

时间:2012-12-29 03:14:18

标签: iphone objective-c ios

enter image description here

我有一个圆形的UIView。我必须只检测紫色圆圈内的触摸。圆圈外的所有触摸,例如。必须忽略黑色方形和白色背景。

设置半径和检测触摸将没有任何用处,因为当多个视图在不同控制器的基础上彼此叠加时,将难以管理。

有什么办法,我可以这样做。请你给我一些建议。

4 个答案:

答案 0 :(得分:5)

创建UIView的自定义子类,说CircularView并覆盖pointInside:withEvent:方法以忽略位于圆圈外的点。这个子类的一个对象是自包含的,你可以用你想要的任何方式来安排它。

要确定圆形区域是否包含点,您可以使用CGPathContainsPoint中的核心图形函数containsPoint:UIBezierPath方法。这将要求您记住代表该圈子的CGPathRefUIBezierPath对象。在此示例中,我假设您使用UIBezierPath创建了一个循环路径,并将其存储为CircularView类的属性。

@interface CircularView : UIView

// initialize this when appropriate
@propery (nonatomic, strong) UIBezierPath *circularPath;

@end

@implementation CircularView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return [circularPath containsPoint:point];
}

@end

就是这样。

答案 1 :(得分:2)

您可以轻松应用触摸条件如果您有圆的半径。 检查圆圈的触摸点中心之间的距离,检查距离是否小于圆的半径,然后触摸,否则忽略它。

您可以使用以下方法计算距离:

-(float)distanceWithCenter:(CGPoint)current with:(CGPoint)SCCenter
{
    CGFloat dx=current.x-SCCenter.x;
    CGFloat dy=current.y-SCCenter.y;

    return sqrt(dx*dx + dy*dy);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 CGFloat radius=5;
 CGPoint centerOfCircle=CGPointMake(140,200);
 UITouch *touch=[touches anyObject];
 CGPoint touchPoint=[touch locationInView:self.view];

 CGFloat distance=[self distanceWithCenter:centerOfCircle with:touchPoint];

 if (distance<=radius) {
  //perform your tast.
 }
}

答案 2 :(得分:1)

为你的圈创建一个UIView的子类,然后像这样重写PointInside:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (![super pointInside:point withEvent:event])
    {
        return NO;
    }
    BOOL isInside = (pow((point.x-self.frame.size.width/2), 2) + pow((point.y - self.frame.size.height/2), 2) < pow((self.frame.size.width/2), 2)) ? YES:NO;
    return isInside;
}

你可以放弃'isInside'变量,但这种方式更容易测试。

答案 3 :(得分:-2)

你可以简单地制作一个按钮,并将其设置为自定义尺寸并使其成为圆形,并且每当用户触摸它时,它可以将1添加到触摸次数的整数或浮点数。就那么简单。