10

我有一个 UIView,它附加了一个 UIPanGestureRecognizer 手势工作正常,除了起点不是平底锅第一次开始的地方,它通常在 x 和 y 坐标中偏离 5 到 15 个像素。不幸的是,差异不是一致并且似乎与平移运动发生的速度有关。

为了验证触摸是否正确发送,我在子视图中添加了一个 touchesBegan 方法,它接收到正确的起点,但手势在开始阶段没有提供相同的点。我的日志中的一些示例如下“线起点”是从手势识别器接收到的第一个点。

touchesBegan got point 617.000000x505.000000
Line start point at 630.000000x504.0000001
touchesBegan got point 403.000000x503.000000
Line start point at 413.000000x504.000000 
touchesBegan got point 323.000000x562.000000
Line start point at 341.000000x568.000000

有没有人见过这个问题?

关于如何解决这个问题而不必实现一个全新的 UIGestureRecognizer 的任何想法?

4

6 回答 6

8

您可以使用手势识别器的委托方法检测手势的初始触摸位置

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
于 2014-02-06T13:43:02.957 回答
4
  CGPoint beg = [panRecognizer locationInView:_scrollView];
  CGPoint trans = [panRecognizer translationInView:_scrollView];
  CGPoint firstTouch = CGPointSubtract(beg, trans);

将此代码放在 UIGestureRecognizerStateBegan 案例中

于 2012-12-15T20:00:46.417 回答
3

文档说,当手指“移动到足以被视为平移”时,平移手势就开始了。这种移动是为了区分按下和拖动,因为用户的手指可能会在他们试图按下而不拖动的情况下移动一点。

我认为这是您在第一个接触点和第一个被认为是阻力的一部分的点之间看到的差异。

于 2010-08-08T18:08:01.857 回答
3

是的,不同之处在于手势识别器在激活之前等待未确定的移动距离。您可以做的是创建自己的 UIPanGestureRecognizer 并在 touchesMoved 覆盖方法中将状态设置为 UIGestureRecognizerStateChanged。

注意:我使用了 touhcesMoved 而不是 touchesBegan,因为我希望它在用户触摸移动时启动,而不是立即启动。

以下是执行此操作的自定义手势识别器的一些示例代码:

#import "RAUIPanGestureRecognizer.h"

@implementation RAUIPanGestureRecognizer 


#pragma mark - UIGestureRecognizerSubclass Methods

- (void)reset
    { [super reset ]; }

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    { [super touchesBegan:touches withEvent:event ]; }

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    { 
        [self setState:UIGestureRecognizerStateChanged ];
        [super touchesMoved:touches withEvent:event ]; 
    }

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    { [super touchesEnded:touches withEvent:event ]; }

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    { [super touchesCancelled:touches withEvent:event ]; }


@end
于 2012-08-01T14:12:15.227 回答
1

为了解决这个问题,您可以尝试在手势识别器开始时重置翻译点。例如,像这样开始您的操作方法:

- (void)panGesture:(UIPanGestureRecognizer *)recognizer;
{
    if ( recognizer.state == UIGestureRecognizerStateBegan )
    {
        CGPoint point = ...; // The view's initial origin.
        UIView *superview = [recognizer.view superview];
        [recognizer setTranslation:point inView:superview];
    }
}
于 2012-01-27T21:06:06.220 回答
0

改变起点的原因正如@Douglas所说:

  • 当手指移动到足以被视为平移时,平移手势开始。

并且起点和平移都是在识别出平移手势后计算的。

我使用以下方式来获得“真正的”起点:

对于具有平移手势的视图,覆盖该-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event方法,并存储“真实”起点以供以后使用:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    self.touchStartPoint = [[[touches allObjects] firstObject] locationInView:self];
}
于 2019-11-22T07:27:41.343 回答