2012-12-21 195 views
6

我有一些问题试图实施三指捏。三指捏手势

我一直在使用2个手指捏与2个手指旋转,单独! (不需要同时需要或需要的手势)问题是很多时候,系统识别错误的移动,因为它们都非常相似,所以我最终不得不移除手指并再次按下,以便尝试使系统识别旋转(通常它确定捏首先)

我搜查了很多,看看delayBegin会帮助,或者如果我可以做一些激活同时手势,但没有工作正常,所以我的想法是,而不是使用2个手指捏,我可以使用3(因为捏比旋转更容易)。

问题是,正如你所知,捏只能用2个手指工作。所以我决定我可以继承UIPinchGestureReconizer,只允许它在屏幕上有3个手指时工作。其余的它可以作为标准夹点工作,甚至忽略三指(计算比例尺),但确保第三根手指仍在屏幕上。

所以,我想下面的实现为我ThreeFingerPinchRecognizer(该子类UIPinchGestureRecognizer

@implementation GRThreeFingerPinchRecognizer 

-(id)initWithTarget:(id)target action:(SEL)action 
    { 
    self = [super initWithTarget:target action:action]; 
    if(self){ 
    } 
    return self; 
} 

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [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]; 
} 

所以,你可以看到,我试图让2手指捏的相同的功能(通过只有调用[super]功能,并在touchesBegantouchesMoved功能,我测试是否有在屏幕上3个手指(通过看event.alltouches.count

这样,旋转正在完善与两个手指,但捏是n工作得很好,它很难激活它,当它的时候,它不工作,因为两个手指捏...

我知道我可能会做这完全错误,所以任何帮助将是伟大的!

非常感谢!

+0

野趣的方式,但PinchGestureRecognizer(这到底是要调用)可能期待触碰2不3,我或许会尝试删除其中一个触摸之前,你打电话super..you将不得不找出哪一个要删除虽然.. – Daniel

+0

我相信这是在PinchGesture里面处理,因为我没有改变事件传递的任何东西,我只转发它!如果我删除了“如果”,捏可以正常工作(但用2个手指) –

+0

*一个不错的提示:3个手指功能在设置中启用缩放功能的用户设备上不起作用(Apple功能中可以双击3手指放大(在任何应用程序中,很像截图功能在任何应用程序中的工作方式))...使用3更精细的应用程序检测功能可能与使用家庭按钮检测功能一样致命。 (我与许多其他人一起启用了此缩放功能) –

回答

0

看到这个片段可以帮助ü确定捏的状态:

if (pinch.numberOfTouches > 1) 
{ 
    CGPoint firstPoint = [pinch locationOfTouch:0 inView:self]; 
    CGPoint secPoint = [pinch locationOfTouch:1 inView:self]; 
    currentUpperY = MIN(firstPoint.y, secPoint.y); 
    if (previousY == 0) previousY = currentUpperY; 
    Float32 y = (self.contentOffset.y + previousY - currentUpperY); 
    [self setContentOffset:CGPointMake(0, y < 0 ? 0 : y) animated:NO]; 

    if (pinch.state == UIGestureRecognizerStateBegan) 
    { 
     pinchStarted = YES; 
     firstY = MIN(firstPoint.y, secPoint.y); 
     secondY = MAX(firstPoint.y, secPoint.y); 
     NSArray *pinchedIndexs = [self indexPathsForRowsInRect:CGRectMake(0.0, firstY, CGRectGetWidth(self.bounds), secondY)]; 
     if (pinchedIndexs.count) itemToOpenOrClose = [[currentItems subarrayWithRange:NSMakeRange(((NSIndexPath *)[pinchedIndexs objectAtIndex:0]).row, pinchedIndexs.count - 1)] copy]; 
    } 
} 

if ((pinch.state == UIGestureRecognizerStateChanged && pinchStarted && itemToOpenOrClose.count) 
    || pinch.state == UIGestureRecognizerStateEnded) 
{ 
    if (pinch.scale > 1) // Pinch OUT 
    { 
     for (Item *item in itemToOpenOrClose) 
     {     
      [self openItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 
    else if (pinch.scale < 1) // Pinch IN 
    { 
     for (Item *item in itemToOpenOrClose) 
     { 
      [self closeItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 

    if (pinch.state == UIGestureRecognizerStateEnded) 
    { 
     pinchStarted = NO; 
     itemToOpenOrClose = nil; 
     previousY = 0; 
    } 
}