iOS 触摸阻塞问题

iOS touch(es) blocking issue

我正在处理的 iOS 应用程序遇到了一个奇怪的问题,该问题与触摸有关。

例如,应用程序的布局看起来像这样(非常基本,没有什么花哨的,只有一些按钮和一个触摸区域):

A 是触摸区域(它是一个容器,里面有一个视图,显示图像的视图,图像会受到我触摸该区域的方式的影响)。

B 是一个简单的 iOS 按钮(您默认使用 XCODE 创建的按钮,只是更改了背景颜色和大小 (width/height)。

现在,问题是:它只发生过几次,我还不知道为什么以及什么时候发生,但有时我可以重现它。基本上,当单击 B 时,触摸 A(用左手的手指)表现得很奇怪:我正在接收 touchesMoved 事件,但触摸位置是触摸 B 的位置,因此 A 中图像的移动确实不会发生,当它发生时(从 B 移开右手手指后),移动的行为就好像触摸是在 B 位置。

这是代码的一部分,处理触摸的部分,在附加到 A 视图的 ViewController 中。我已经删除了一些我认为与我的问题无关的代码,以使事情更清晰。

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{

    NSLog(@"A View touched : %d", [touches count]);
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView: _theAView];
    NSLog(@"Touch at %f %f", touchLocation.x, touchLocation.y);
    initialTouchX = touchLocation.x;
    initialTouchY = touchLocation.y;    


}

-(void)touchesMoved:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{

    /*
    some code was here handling time, to only handle moving every X milliseconds
    */
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:theAView];


    /*
    code handling the display of the image , removed
    */
    initialTouchX = touchLocation.x;
    initialTouchY = touchLocation.y;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

}

B键的代码,只是一个基本的IBAction,调用一个带参数的函数:

- (IBAction)btnDown:(id)sender {
    //call some function here 
}

注意两点:

1) 上面代码中,"theAView"指的是A区的view。 2) 代码的第一部分(有触摸的部分)位于不同的 ViewController 中;代码的第二部分,对于按钮,位于 XCODE 创建项目时创建的默认 ViewController 文件中。

我也尝试在 A 视图和 B 按钮上启用多点触控,但问题仍然存在。

感谢任何帮助。

提前致谢。

编辑:我几乎每次都能重现这种行为的一种情况是,当我几乎同时触摸 A 和 B 时,先是 B,然后是 A。考虑将此添加到问题中可能会有一些帮助。

i am receiving the touchesMoved event, but the touch position is the position of the touch on B

问题是,在视图 A 的触摸处理中,您正在检查错误的触摸。这行是错误的,每次出现:

UITouch *touch = [[event allTouches] anyObject];

[[event allTouches] anyObject] 包括 all 次接触到 all 次观看。因此,触摸位置是视图 B 上触摸的位置,因为这个 视图 B 上的触摸。

相反,检查 [touches anyObject];这些是针对 this 视图(视图 A)的触摸。