iOS模拟器在随机时间段后停止正确识别手势

iOS模拟器在随机时间段后停止正确识别手势,ios,objective-c,simulator,uitapgesturerecognizer,uipangesturerecognizer,Ios,Objective C,Simulator,Uitapgesturerecognizer,Uipangesturerecognizer,对不起,这么久了。这对我来说是一个谜,寻找任何人可能有的指针 iOS模拟器中似乎存在一个缺陷,即UIgestureRecognitor的工作方式和传递触点的方式一直持续到模拟器重新启动。即使在模拟器中关闭并重新启动应用程序也无法修复它。修复它(暂时)的唯一方法是完全退出模拟器并重新启动它 在UIViewController子类中有一个SKView子类。SKView子类占据UIViewController的底部,顶部包含一些按钮和其他控件。游戏包括轻敲和平移,由UIgestureControlle

对不起,这么久了。这对我来说是一个谜,寻找任何人可能有的指针

iOS模拟器中似乎存在一个缺陷,即UIgestureRecognitor的工作方式和传递触点的方式一直持续到模拟器重新启动。即使在模拟器中关闭并重新启动应用程序也无法修复它。修复它(暂时)的唯一方法是完全退出模拟器并重新启动它

在UIViewController子类中有一个SKView子类。SKView子类占据UIViewController的底部,顶部包含一些按钮和其他控件。游戏包括轻敲和平移,由UIgestureController管理,UIgestureController由拥有SKView子类的SKView子类管理,SKView子类拥有SKScene子类

在任意时间段后,手势将停止正常工作。在场景所拥有的视图中,它们都无法正确识别。如果我在SKView外部和父UIViewController中单击,则它们会显示出来,但坐标都是错误的。它也会出现状态错误-有时UIPangestureRecognitor会认为有两个手指被按下,而不是只有一个手指。UIPangestureRecognitor也同样关闭。这种行为没有可识别的模式——它只是突然开始的

以下是初始化SKView及其场景的相关代码:

    SKView * _gameView = [[SKView alloc] initWithFrame : gameRect];
    _gameView.clipsToBounds = YES;
    // _gameView.scene is an SKScene subclass
    CGSize gameSize = CGSizeMake(_gameView.bounds.size.width,
                                 _gameView.bounds.size.width);
    _scene = [[GameScene alloc] initWithSize : gameSize];
    // Present the scene.
    [_gameView presentScene : _scene];
    [self.view addSubview : _gameView];
以下是SKScene子类中注册UIGestureControllers的代码:

- (void) initializeGestureRecognition : (SKView *) view
{
    UIPanGestureRecognizer * panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget : self action : @selector (handlePanGesture:)];
    UITapGestureRecognizer * tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleTapGesture:)];
    panRecognizer.delegate = self;
    tapRecognizer.delegate = self;
    panRecognizer.maximumNumberOfTouches = 2;
    [tapRecognizer requireGestureRecognizerToFail : panRecognizer];
    [view addGestureRecognizer : panRecognizer];
    [view addGestureRecognizer : tapRecognizer];
}
以下是UIPanGestureRecognizer的handlePanGesture委托的代码:

-(void) handlePanGesture : (UIPanGestureRecognizer*) panRecognizer
{
    self.deltaInView = [panRecognizer translationInView : self.view];
    self.deltaInScene = CGPointMake(deltaInView.x, -(deltaInView.y));
    if (UIGestureRecognizerStateChanged == panRecognizer.state)
        {
            self.panTouchPoint = [self getPanTouchPoint : panRecognizer];
        }
    else if (UIGestureRecognizerStateEnded == panRecognizer.state)
        {
            // Other non-relevant stuff here
        }
}

- (CGPoint) didGetPanTouchPoint : (UIPanGestureRecognizer*) panRecognizer
{
    CGPoint touchPoint = CGPointMake(0.0, 0.0);
    if (2 == panRecognizer.numberOfTouches)
    {
        CGPoint tempPoint = [self calculateSafeCentroidPointFromRecognizer : panRecognizer];
        touchPoint = [self convertPointFromView : tempPoint];
    }
    else if (1 == panRecognizer.numberOfTouches)
    {
        CGPoint tempPoint = [panRecognizer locationOfTouch : 0
                                                    inView : self.view];
        touchPoint = [self convertPointFromView : tempPoint];
    }
    return touchPoint;
}


- (CGPoint) calculateSafeCentroidPointFromRecognizer : (UIGestureRecognizer*) recognizer
{
    CGPoint thisPointInView = [recognizer locationOfTouch : 0
                                                   inView : self.view];
    CGPoint thatPointInView = [recognizer locationOfTouch : 1
                                                   inView : self.view];
    CGPoint safePoint = [self calculateCentroidPoint : thisPointInView
                                         secondPoint : thatPointInView];
    return safePoint;
}


CGPoint CalculateCentroidPoint(const CGPoint * thisPoint,
                               const CGPoint * thatPoint)
{
    CGPoint centroidPoint = CGPointMake((thisPoint->x + thatPoint->x) / 2.0),
                                        (thisPoint->y + thatPoint->y) / 2.0));
    return centroidPoint;
}
- (void) handleTapGesture : (UIGestureRecognizer *) gestureRecognizer
{
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        UITapGestureRecognizer * tapRecognizer = (UITapGestureRecognizer*) gestureRecognizer;
        CGPoint viewTouchLocation = [tapRecognizer locationOfTouch : 0
                                                            inView : self.view];
        CGPoint sceneTouchLocation = [self convertPointFromView : viewTouchLocation];
        // Do other stuff here
    }
}
以下是UITapGestureRecognitor的HandletApsignature委托的代码:

-(void) handlePanGesture : (UIPanGestureRecognizer*) panRecognizer
{
    self.deltaInView = [panRecognizer translationInView : self.view];
    self.deltaInScene = CGPointMake(deltaInView.x, -(deltaInView.y));
    if (UIGestureRecognizerStateChanged == panRecognizer.state)
        {
            self.panTouchPoint = [self getPanTouchPoint : panRecognizer];
        }
    else if (UIGestureRecognizerStateEnded == panRecognizer.state)
        {
            // Other non-relevant stuff here
        }
}

- (CGPoint) didGetPanTouchPoint : (UIPanGestureRecognizer*) panRecognizer
{
    CGPoint touchPoint = CGPointMake(0.0, 0.0);
    if (2 == panRecognizer.numberOfTouches)
    {
        CGPoint tempPoint = [self calculateSafeCentroidPointFromRecognizer : panRecognizer];
        touchPoint = [self convertPointFromView : tempPoint];
    }
    else if (1 == panRecognizer.numberOfTouches)
    {
        CGPoint tempPoint = [panRecognizer locationOfTouch : 0
                                                    inView : self.view];
        touchPoint = [self convertPointFromView : tempPoint];
    }
    return touchPoint;
}


- (CGPoint) calculateSafeCentroidPointFromRecognizer : (UIGestureRecognizer*) recognizer
{
    CGPoint thisPointInView = [recognizer locationOfTouch : 0
                                                   inView : self.view];
    CGPoint thatPointInView = [recognizer locationOfTouch : 1
                                                   inView : self.view];
    CGPoint safePoint = [self calculateCentroidPoint : thisPointInView
                                         secondPoint : thatPointInView];
    return safePoint;
}


CGPoint CalculateCentroidPoint(const CGPoint * thisPoint,
                               const CGPoint * thatPoint)
{
    CGPoint centroidPoint = CGPointMake((thisPoint->x + thatPoint->x) / 2.0),
                                        (thisPoint->y + thatPoint->y) / 2.0));
    return centroidPoint;
}
- (void) handleTapGesture : (UIGestureRecognizer *) gestureRecognizer
{
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        UITapGestureRecognizer * tapRecognizer = (UITapGestureRecognizer*) gestureRecognizer;
        CGPoint viewTouchLocation = [tapRecognizer locationOfTouch : 0
                                                            inView : self.view];
        CGPoint sceneTouchLocation = [self convertPointFromView : viewTouchLocation];
        // Do other stuff here
    }
}
需要注意的一件有趣的事情是,轻拍和平移手势识别器都不正确。这不是一个或另一个。这使我相信存在一些系统性问题

(或者,更可能的是,我把事情搞砸了。)


有什么想法吗?

有时模拟器会认为您按下了选项(⌥) 键并被卡住,这意味着屏幕上的捏手势助手被激活。要停止,只需再次按Option即可。。如果不起作用,请尝试按Command。

难以置信!清理项目后,重新启动并重置模拟器(无任何帮助!)。按下选项键,就是这样。不敢相信它在sim重置后“记住”了选项键。你赢了。这解决了它。完全奇怪的问题,但你只为我节省了一大堆时间,并对我的代码进行了徒劳的调试。谢谢!我很乐意为此给你100票。真不敢相信我在这上面浪费了多少时间。