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)的触摸。
我正在处理的 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)的触摸。