UIView touchesEnded事件未在第一次点击时调用,但如果再次点击则调用

时间:2016-01-04 09:49:11

标签: ios objective-c uiview uiresponder

我有一个名为" MyView"的UIView子类。在ControllerA中,它有一个属性MyView *myView,并将其添加到self.view。在myView上,有一些随机子视图从右向左滑动,然后消失。我想要做的是,当用户点击其中一个滑动子视图时,识别该视图,然后按下另一个控制器。

在MyView.m中,我覆盖了touchesBegantouchesEndedtouchesCanceled,并在每种方法中添加了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;
    }
}

我的操作步骤是:

  1. 当我点击一个子视图时,日志是:开始,结束。然后推送到controllerB。

  2. 当我弹回控制器A并点击一个子视图时,日志是:开始,取消,并没有推送到controllerB,因为touchesEnded没有被调用。

  3. 再次点击子视图时,日志为:开始,结束,然后推送到controllerB。

  4. 我怀疑原因是因为推动,所以我评论了“识别' touchesEnded方法中的代码,现在,当我点击子视图时,日志始终是:开始,结束。

    所以我的问题是,为什么touchesEnded方法在步骤2中没有被调用?

    我尝试使用performSelector:afterDelay:延迟推送,但它没有帮助。当我弹出并点击子视图时,始终会调用touchesCancelled方法,然后再次点击,然后调用touchesEnded

    任何人都能帮助我吗?在此先感谢您的祝福!

2 个答案:

答案 0 :(得分:2)

检查您是否在所涉及的任何视图控制器上激活了手势识别,如果是,请将其关闭。在某些情况下,识别者倾向于取消接触。根据您的描述,我了解到您无论如何都不使用手势识别器。

答案 1 :(得分:1)

为什么不为每个子视图设置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;

}