所以我有一个可变数组,它包含几个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到仅使用我的可变数组中的对象?
答案 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;
}