【问题标题】:How to get UITouch location from UIGestureRecognizer如何从 UIGestureRecognizer 获取 UITouch 位置
【发布时间】:2013-05-13 03:46:04
【问题描述】:

我想从 UIGestureRecognizer 获取我的水龙头的 UITouch 位置,但我无法通过查看文档和其他 SO 问题来弄清楚如何。你们中的一个可以指导我吗?

- (void)handleTap:(UITapGestureRecognizer *)tapRecognizer
{
    CCLOG(@"Single tap");
    UITouch *locationOfTap = tapRecognizer; //This doesn't work

    CGPoint touchLocation = [_tileMap convertTouchToNodeSpace:locationOfTap];
    //convertTouchToNodeSpace requires UITouch

    [_cat moveToward:touchLocation];
}

此处已修复代码 - 这也修复了倒 Y 轴

CGPoint touchLocation = [[CCDirector sharedDirector] convertToGL:[self convertToNodeSpace:[tapRecognizer locationInView:[[CCDirector sharedDirector] openGLView]]]];

【问题讨论】:

    标签: ios objective-c xcode cocos2d-iphone uigesturerecognizer


    【解决方案1】:

    您可以在 UIGestureRecognizer 上使用locationInView: 方法。如果为视图传递 nil,此方法将返回窗口中触摸的位置。

    - (void)handleTap:(UITapGestureRecognizer *)tapRecognizer
    {
        CGPoint touchPoint = [tapRecognizer locationInView: _tileMap]
    }
    

    还有一个有用的委托方法gestureRecognizer:shouldReceiveTouch:。只需确保实现并将您的点击手势的委托设置为 self。

    保留对手势识别器的引用。

    @property UITapGestureRecognizer *theTapRecognizer;
    

    初始化手势识别器

    _theTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(someMethod:)];
    _theTapRecognizer.delegate = self;
    [someView addGestureRecognizer: _theTapRecognizer];
    

    监听委托方法。

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        CGPoint touchLocation = [_tileMap convertTouchToNodeSpace: touch];
        // use your CGPoint
        return YES;
    }
    

    【讨论】:

    • 我的CGPoint touchLocation = [_tileMap convertTouchToNodeSpace:locationOfTap]; 需要一个 UITouch,convertTouchToNodeSpace 转换一个 UITouch.. 这段代码可以这样使用吗?
    • 你能不能修改convertTouchToNodeSpace:方法来接收一个CGPoint?
    • 找不到定义的地方,哈哈哈
    • 命令点击方法名。还是在私有框架中?
    • 不,它的 cocos2d,开源。
    【解决方案2】:

    试试这个:

    -(void) didMoveToView:(SKView *)view{
        oneFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTapDetected:)];
        oneFingerTap.numberOfTapsRequired=1;
        oneFingerTap.numberOfTouchesRequired=1;
    
        [view addGestureRecognizer:oneFingerTap];
    }
    
    -(void)oneTapDetected:(UITapGestureRecognizer *)recognizer{
        NSLog(@"one tap detec");
        tapPositionOneFingerTap = [oneFingerTap locationInView:self.view];
        NSLog(@"%f, %f",tapPositionOneFingerTap.x,tapPositionOneFingerTap.y);
    }
    

    这会打印控制台中每次点击的坐标。

    【讨论】:

      【解决方案3】:

      Apple Docs

      UIGestureRecognizer

      - (NSUInteger)numberOfTouches
      

      接收者维护的私有数组中 UITouch 对象的数量。

      所以你不应该访问它们。

      在循环中使用此方法返回的值,您可以使用locationOfTouch:inView: 方法询问各个触摸的位置。

      【讨论】:

        【解决方案4】:

        在斯威夫特中:

        func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
           print("tap working")
           if gestureRecognizer.state == UIGestureRecognizerState.Recognized
           { 
              print(gestureRecognizer.locationInView(gestureRecognizer.view))
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多