UIControl 跟踪在不同 UIControl 上开始的触摸
Posted
技术标签:
【中文标题】UIControl 跟踪在不同 UIControl 上开始的触摸【英文标题】:UIControl tracking touch that started on a different UIControl 【发布时间】:2014-10-04 07:58:11 【问题描述】:我正在制作一个自定义 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 上被调用。
识别所有按钮上来来去去的触摸的最佳方法是什么?我必须通过父视图完成所有操作吗?
【问题讨论】:
【参考方案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
拦截其组件的触摸。
确实如此,我想稍后我会进行重构以使其以这种方式工作。谢谢!以上是关于UIControl 跟踪在不同 UIControl 上开始的触摸的主要内容,如果未能解决你的问题,请参考以下文章