在其他UIControl上启动的UIControl跟踪触摸



我正在制作一个自定义的iOS键盘,并有一个UIControl子类来表示我的按钮。我正试图获得与正常iOS键盘相同的行为:

  1. 用户开始触摸一个按钮
  2. 用户拖动其他按钮(需要检测到这一点,以便它们可以相应地高亮显示/取消高亮显示)
  3. 当用户抬起手指时,记录实际的键盘"按下";也就是说,触摸结束

我正在使用这样的触摸跟踪方法进行测试:

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    [super beginTrackingWithTouch:touch withEvent:event];
    NSLog(@"Begin for %@", [self label]);
    return YES;
}
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    [super continueTrackingWithTouch:touch withEvent:event];
    NSLog(@"Continue for %@", [self label]);
    return YES;
}
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
    [super endTrackingWithTouch:touch withEvent:event];
    NSLog(@"End for %@", [self label]);
}

这些方法都被调用了,只是它们只在触摸开始的UIControl上被调用过。

识别我所有按钮上的触摸的最佳方法是什么?我必须通过父视图完成所有操作吗?

如果提供,我会选择更好的答案。。。但如果有人通过搜索找到了这个,我已经设法通过这种方式得到了我需要的东西:

  • 将按钮类(UIControl子类)的userInteractionEnabled设置为NO
  • 不要覆盖按钮类中的任何触摸方法
  • 在视图控制器中实现touchesBegan:withEvent:touchesMoved:withEvent:touchesEnded:withEvent:
  • 在每个事件中,从UITouch对象中提取位置
  • 遍历所有按钮子视图,找到包含触摸位置的子视图:

    - (MyButton *)buttonForTouch:(UITouch *)touch
    {
        CGPoint windowLocation = [touch locationInView:keyboardView];
        for (MyButton *button in buttons) {
            if (CGRectContainsPoint([button frame], windowLocation)) {
                return button;
            }
        }
        return nil;
    }
    
  • 在确定用户正在与哪个按钮交互后,使视图控制器向相关按钮发送消息以调整其外观

  • 如果合适,请在touchesBegan:withEvent:中保留对UITouch实例的引用,这样您就可以确保在其他方法中跟踪的是同一个实例

我认为你应该有一个大的UIControl,它有不同的子视图(如UIButton),但像你已经做过的那样自己跟踪触摸,但根据触摸位置找出要突出显示的子视图。

最新更新