更改[触摸anyObject]以触摸数组中的任何对象

时间:2012-04-24 14:26:21

标签: objective-c ios nsmutablearray uitouch touchesbegan

所以我有一个可变数组,它包含几个UIViews的圆圈。 现在,我接触了这样的方法设置。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint touchLocation = [touch locationInView:self.view];

    for (Circle *circle in playerOneCircles)
    {
        if ([circle.layer.presentationLayer hitTest:touchLocation])
        {
            [circle playerTap:nil];
            break;
        } 
    }   
}

这很好用。但它给出了重叠视图的问题。 我希望其他UI视图也响应touchesbegan方法(然后会触发其他方法)。但是如果2个物体重叠,那么我的触摸将触发错误的方法。

所以我想定义多个只响应某些对象而不是anyObject的UITouches。我如何定义UITouch到使用我的可变数组中的对象?

1 个答案:

答案 0 :(得分:1)

修改

添加评论以回答您的评论以解释代码。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // We want to find all the circles that contain the touch point.
    // A circle does not have to be "on top" (or even visible) to be touched.
    // All circles that contain the touch point will be added to the touchedCircles set.
    NSMutableSet *touchedCircles = [NSMutableSet set];

    // To support multiple touches, we have to look at every touch object.
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:self.view];
        // Search through our collection of circle objects.  Any circle that
        // contains this touch point gets added to our collection of touched
        // circles.  If you need to know which UITouch is "touching" each circle,
        // you will need to store that as well.
        for (Circle *circle in playerOneCircles) {
            if ([circle containsPoint:touchLocation]) {
                [touchedCircles addObject:circle];
            }
        }
    }

    // We have completed our search for all touches and all circles.  If
    // and circle was touched, then it will be in the set of touchedCircles.
    if (touchedCircles.count) {
        // When any circle has been touched, we want to call some special method
        // to process the touched circle.  Send the method the set of circles, so it
        // knows which circles were touched.
        [self methodAWithTouchedCircles:touchedCircles];
    } else {
        // None of our circles were touched, so call a different method.
        [self methodB];
    }
}

你会为这样的圆圈实现containsPoint ......

- (BOOL)containsPoint:(CGPoint)point
{
    // Since each of our objects is a circle, to determine if a point is inside
    // the circle, we just want to know if the distance between that point and
    // the center of the circle is less than the radius of the circle.
    // If your circle is really contained inside a view, you can compute the radius
    // as one-half the width of the frame.
    // Otherwise, your circle may actually have its own radius property, in which case
    // you can just use the known radius.
    CGFloat radius = self.frame.size.width *.5;

    // This is just the Pythagorean Theorem, or instance formula.
    // distance = sqrt((x0-x1)^2 + (y0-y1)^2)
    // and we want to check that
    //     distance < radius
    // By simple algebra, that is the same as checking
    //     distance^2 < radius^2
    // which saves us from having to compute the square root.
    CGFloat diffX = self.center.x - point.x;
    CGFloat diffY = self.center.y - point.y;
    return (diffX*diffX) + (diffY*diffY) < radius*radius;
}