UIView touchesEnded 事件在第一次点击时不调用,但在再次点击时调用
UIView touchesEnded Event not called on first tap, but called if tap again
我有一个名为 "MyView" 的 UIView
子类。在ControllerA中,它有一个属性,MyView *myView
,并将其添加到self.view
。在myView
上,有一些随机的子视图从右向左滑动,然后消失。我想要做的是,当用户点击其中一个滑动子视图时,识别该视图,然后按下另一个控制器。
在MyView.m中我覆盖了touchesBegan
、touchesEnded
、touchesCanceled
,并在每个方法中添加了NSLog。在 touchesEnded
方法中,我使用下面的代码来识别被点击的子视图:
UITouch *touch = [touches anyObject];
CGPoint touchLoaction = [touch locationInView:self];
for (UIView *subview in self.subviews) {
if ([subview.layer.presentationLayer hitTest:touchLoaction]) {
if (_delegate && [_delegate respondsToSelector:@selector(canvas:didSelectView:)]) {
[_delegate canvas:self didSelectView:subview];
}
break;
}
}
我的操作步骤是:
当我点击一个子视图时,日志是:开始,结束。然后推送到controllerB。
当我返回到控制器 A 并点击一个子视图时,日志是:开始、取消并且没有推送到控制器 B,因为没有调用 touchesEnded。
再次点击子视图时,日志为:开始,结束,然后推送到controllerB。
我怀疑是推送的原因,所以我在touchesEnded
方法中注释掉了'identifying'代码,现在,当我点击一个子视图时,日志总是:开始,结束.
所以我的问题是,为什么在第 2 步中没有调用 touchesEnded
方法?
我尝试使用performSelector:afterDelay:
来延迟推送,但没有用。当我弹出并点击子视图时,总是调用 touchesCancelled
方法,然后再次点击,然后调用 touchesEnded
方法。
谁能帮我解决这个问题?提前致谢并致以最良好的祝愿!
检查您是否在任何涉及的视图控制器上激活了手势识别,如果是,请将其关闭。在某些情况下,识别器倾向于取消触摸。根据您的描述,我了解到您并没有使用手势识别器。
为什么不为每个子视图设置 UIGestureRecognizers 而不是使用 touchesBegan、touchesEnded 和 touchesCanceled?
完成后,您还可以在事件发生之前捕获事件,实现更精细的 UIGestureRecognizerDelegate 方法。
- (void)viewDidLoad {
[super viewDidLoad];
// Add the delegate to the tap gesture recognizer
self.tapGestureRecognizer.delegate = self;
}
// Implement the UIGestureRecognizerDelegate method
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// Determine if the touch is inside the custom subview
if ([touch view] == self.customSubview){
// If it is, prevent all of the delegate's gesture recognizers
// from receiving the touch
return NO;
}
return YES;
}
我有一个名为 "MyView" 的 UIView
子类。在ControllerA中,它有一个属性,MyView *myView
,并将其添加到self.view
。在myView
上,有一些随机的子视图从右向左滑动,然后消失。我想要做的是,当用户点击其中一个滑动子视图时,识别该视图,然后按下另一个控制器。
在MyView.m中我覆盖了touchesBegan
、touchesEnded
、touchesCanceled
,并在每个方法中添加了NSLog。在 touchesEnded
方法中,我使用下面的代码来识别被点击的子视图:
UITouch *touch = [touches anyObject];
CGPoint touchLoaction = [touch locationInView:self];
for (UIView *subview in self.subviews) {
if ([subview.layer.presentationLayer hitTest:touchLoaction]) {
if (_delegate && [_delegate respondsToSelector:@selector(canvas:didSelectView:)]) {
[_delegate canvas:self didSelectView:subview];
}
break;
}
}
我的操作步骤是:
当我点击一个子视图时,日志是:开始,结束。然后推送到controllerB。
当我返回到控制器 A 并点击一个子视图时,日志是:开始、取消并且没有推送到控制器 B,因为没有调用 touchesEnded。
再次点击子视图时,日志为:开始,结束,然后推送到controllerB。
我怀疑是推送的原因,所以我在touchesEnded
方法中注释掉了'identifying'代码,现在,当我点击一个子视图时,日志总是:开始,结束.
所以我的问题是,为什么在第 2 步中没有调用 touchesEnded
方法?
我尝试使用performSelector:afterDelay:
来延迟推送,但没有用。当我弹出并点击子视图时,总是调用 touchesCancelled
方法,然后再次点击,然后调用 touchesEnded
方法。
谁能帮我解决这个问题?提前致谢并致以最良好的祝愿!
检查您是否在任何涉及的视图控制器上激活了手势识别,如果是,请将其关闭。在某些情况下,识别器倾向于取消触摸。根据您的描述,我了解到您并没有使用手势识别器。
为什么不为每个子视图设置 UIGestureRecognizers 而不是使用 touchesBegan、touchesEnded 和 touchesCanceled? 完成后,您还可以在事件发生之前捕获事件,实现更精细的 UIGestureRecognizerDelegate 方法。
- (void)viewDidLoad {
[super viewDidLoad];
// Add the delegate to the tap gesture recognizer
self.tapGestureRecognizer.delegate = self;
}
// Implement the UIGestureRecognizerDelegate method
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// Determine if the touch is inside the custom subview
if ([touch view] == self.customSubview){
// If it is, prevent all of the delegate's gesture recognizers
// from receiving the touch
return NO;
}
return YES;
}