我正在制作一个自定义的iOS键盘,并有一个UIControl子类来表示我的按钮。我正试图获得与正常iOS键盘相同的行为:
- 用户开始触摸一个按钮
- 用户拖动其他按钮(需要检测到这一点,以便它们可以相应地高亮显示/取消高亮显示)
- 当用户抬起手指时,记录实际的键盘"按下";也就是说,触摸结束
我正在使用这样的触摸跟踪方法进行测试:
- (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
),但像你已经做过的那样自己跟踪触摸,但根据触摸位置找出要突出显示的子视图。