在多个子视图中传递UITouch *的正确方法是什么?

时间:2013-07-26 07:51:30

标签: ios objective-c uiview uitouch

我有一个包含多个子视图的自定义视图。它们都是屏幕上的圆圈,有点像三个不同半径的轮子。我正在尝试让他们正确接收UITouch *事件,让他们用手指旋转。由于形状实际上是屏幕上的正方形,当较大的形状翻转并且可触摸区域进入上方的圆形框架时,它变得不可触及。

因此,我在其他子视图上创建了另一个子视图,用于计算触摸点到中心的距离并相应地分配触摸事件。我可以想到几种方法,但我想知道处理这种情况最优雅,最正确的方法是什么。

这是我到目前为止所做的:我的自定义视图有一个委托,该委托被分配给我的主viewController。我的自定义视图中有三种协议方法,分别用于三个轮子。我根据UITouch的观点传递了触摸和事件,但我不确定我应该如何将这些数据实际发送到应该接收它的视图。它们都是自定义UIControl对象,它们都通过-beginTrackingWithTouch:withEvent:处理触摸。由于这是一个私有方法,我无法从我的viewController访问它。我应该公开这个方法并从viewController访问它,还是有更正确的方法来处理它?<​​/ p>

编辑:添加了代码:

这是我在自定义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的协议?或者还有其他方法来妥善处理这个问题吗?

1 个答案:

答案 0 :(得分:1)

即使我没有尝试过,也没有必要自己做计算。 -hitTest:withEvent:应该可以正常使用。