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 上开始的触摸的主要内容,如果未能解决你的问题,请参考以下文章

UIControl 跟踪和 iOS 13 演示样式卡不能一起工作

自定义 UIControl,动作调用两次

UIControl 轨道触及其视图之外

将参数传递给 UIcontrol 回调函数

突出显示时如何更改 UIControl 的大小?

子类 UIControl 来制作自定义选择器