【问题标题】:UIControl tracking touch that started on a different UIControlUIControl 跟踪在不同 UIControl 上开始的触摸
【发布时间】:2014-10-04 07:58:11
【问题描述】:

我正在制作一个自定义 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 上被调用。

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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

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

    • 将按钮类(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 实例的引用,以便确保在其他方法中跟踪相同的实例

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以您建议不要将按钮放在UIView 中并将逻辑放在UIViewController 子类中,而是将按钮和逻辑放在一个UIControl 子类中?这似乎更干净一些。这就是你的意思吗?
      • 如果你想要一个UIControl,这就是要走的路。两种方式都很好,但是您编写的方法是针对单个控件并且不与其他控件交互的。所以要么你这样做,要么像你已经说过的那样让UIViewController拦截其组件的触摸。
      • 确实如此,我想稍后我会进行重构以使其以这种方式工作。谢谢!
      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多