我有一个包含多个子视图的自定义视图。它们都是屏幕上的圆圈,有点像三个不同半径的轮子在彼此之上。我试图让他们正确接收 UITouch * 事件以使他们用手指旋转。由于屏幕上的形状实际上是正方形,当一个较大的翻转并且它的可触摸区域进入上面的圆形框架时,它变得不可触摸。
因此,我在其他子视图之上创建了另一个子视图,它将计算触摸点到中心的距离并相应地分配触摸事件。我可以想到几种方法,但我想知道处理这种情况的最优雅、最正确的方法是什么。
这是我到目前为止所做的:我的自定义视图有一个委托,并且该委托被分配给我的主 viewController。我的自定义视图中有三个协议方法,分别用于三个轮子。我正在根据 UITouch 的点传递触摸和事件,但我不确定我应该如何实际将这些数据发送到应该接收它的视图。它们都是自定义 UIControl 对象,它们都通过-beginTrackingWithTouch:withEvent:
. 由于这是一个私有方法,我无法从我的 viewController 访问它。我应该公开这个方法并从 viewController 访问它,还是有更正确的方法来处理这个?
编辑:添加代码:
这就是我在自定义 UIView 对象中分配触摸的方式。计算工作正常。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//Distribute the touches according to the touch location.
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
//calculations for the circles.
CGFloat xDistance = (point.x - BIGGEST_CIRCLE_RADIUS);
CGFloat yDistance = (point.y - BIGGEST_CIRCLE_RADIUS);
CGFloat distance = sqrtf((xDistance*xDistance) + (yDistance*yDistance));
//Check to see if the point is in one of the circles, starting from the innermost circle.
if (distance <= SMALLEST_CIRCLE_RADIUS) {
[self.delegate smallestCircleReceivedTouch:touch withEvent:event];
} else if (distance < MIDDLE_CIRCLE_RADIUS) {
[self.delegate middleCircleReceivedTouch:touch withEvent:event];
} else if (distance <= BIGGEST_CIRCLE_RADIUS) {
[self.delegate biggestCircleReceivedTouch:touch withEvent:event];
} else {
return;
}
}
委托是 viewController,圆圈是自定义 UIControls。他们像这样处理触摸:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchPoint = [touch locationInView:self];
{....}
return YES;
}
这些本身工作正常,但我不确定我应该如何将委托方法连接到每个自定义 UIControl 的触摸处理。我应该从 viewController 调用它们-beginTrackingWithTouch:withEvent:
,还是应该让它们实现 customView 的协议?还是有其他方法可以正确处理这个问题?