2012-04-24 52 views
0

因此,我有一个可变数组,其中包含UIViews的几个圆。 现在我有我的触摸开始像这样的方法设置。更改[触摸anyObject]触及数组中的任何对象

- (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; 
     } 
    } 
} 

这工作正常。但它会产生重叠视图的问题。 我希望其他UIviews也能够响应touchesbegan方法(这会触发其他方法)。但如果两个对象会重叠,那么我的touchesbegan会触发错误的方法。

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

+0

我很抱歉,但这个问题是非常混乱。你想处理多个触摸,以便同时触摸两个不同的对象“选择”它们?或者,你是否需要一次触摸来“选择”触摸可能“击中”的所有对象?或者两者都有?也许我更加困惑,你也不想要。 – 2012-04-24 16:53:49

+0

我会再试一次: 我在我的阵列中有圈子。如果任何一个圆圈被触摸,我想执行方法A.如果用户没有触及任何圆圈(I.E.视图本身),那么我想执行方法B – 2012-04-24 17:51:46

回答

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; 
} 
+0

谢谢我得到它的工作。我确信我明白,你是否愿意解释代码?所以你创建一个集合。在那个设置中添加轻击的按钮。所以在下一个方法中,它会检查该集合中是否存在一个对象,如果它为真则执行它? – 2012-04-25 09:53:45