Cocoa touch UIP检测识别器起点已关闭

Cocoa touch UIP检测识别器起点已关闭,cocoa-touch,uigesturerecognizer,Cocoa Touch,Uigesturerecognizer,我有一个UIView,上面有一个UIPangestureRecognitor。这个手势工作正常,只是起始点不是平移开始的位置。它通常在x和y坐标下都偏离了5到15个像素。不幸的是,变化不一致,似乎与平移运动的速度有关地点 为了验证触摸是否被正确发送,我在子视图中添加了一个touchesbeent方法,它接收到正确的起始点,但手势在开始阶段没有提供相同的点。下面是我日志中的一些示例,“行起点”是从手势识别器接收到的第一个点 touchesBegan got point 617.000000x505

我有一个UIView,上面有一个UIPangestureRecognitor。这个手势工作正常,只是起始点不是平移开始的位置。它通常在x和y坐标下都偏离了5到15个像素。不幸的是,变化不一致,似乎与平移运动的速度有关地点

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

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
以前有人见过这个问题吗

关于如何解决这个问题而不必实施全新的UIgestureRecognitor,您有什么想法吗?

说,当手指“移动到足以被视为平移”时,平移手势开始。这个动作是为了区分按压和拖动,因为用户在不拖动的情况下尝试按压时,手指可能会移动一点


我想这就是你所看到的第一个接触点和第一个被认为是阻力一部分的点之间的区别。

要解决这个问题,你可以尝试在手势识别器开始时重置转换点。例如,按如下方式开始您的操作方法:

- (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];
    }
}

是的,区别在于手势识别器在激活之前等待一段不确定的移动距离。您可以做的是创建自己的UIPangestureRecognitor,并在TouchsMoved override方法中将状态设置为UIgestureRecognitzerStateChanged

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

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

#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

将此代码放入UIgestureRecognitizerStateStart案例中

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

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

  • 当手指移动到足以被视为平移时,平移手势开始
识别出平移手势后,计算出平移的起始点和平移量

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

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

-(void)touchesbeated:(NSSet*)toucheevent:(UIEvent*)event{
[超级触摸开始:触摸事件:事件];
self.touchStartPoint=[[[touchs allObjects]firstObject]locationInView:self];
}

即使您通过扩展UIGestureRecognitor创建了自己的手势识别器,也会出现问题,起点与touchesBegind方法不同。我向苹果提交了一个bug。嗯,我不确定我是否理解。如果你正在实现你自己的UIgestureRecognitor,你会定义你自己的接触起点吗?@Douglas-你有没有找到解决这个问题的方法?@CoDEFRo我没有再进一步研究过,也许Cory有过。@Cory Powers-解决这个问题有什么运气吗?我有这个问题所描述的确切问题,这帮助我以正确的方式解决了这个问题(IMHO)。CGPoint startingLocation=[touch locationInView:self];//在内部工作,这很好。另一个使用UILongPressGestureRecognitor且无需存储起点的选项。这两种解决方案都有优点/缺点。有关详细信息,请参阅。工作非常出色。别忘了在类实现的开头导入,这是否回答了您的问题?
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch