2012-12-21 16 views
6

3本のピンチを実装しようとするときに問題が発生します。3本のピンチジェスチャー

私は2本の指のピンチと2本の指の回転を個別に使いました! (必要な同時ジェスチャーは必要ありません)問題は何度も、システムが間違った動きを識別するため、両方が非常に似ているため、システムを識別させるために指を離してもう一度押す必要があります回転(通常はピンチを最初に識別する)

delayBeginが助けになるかどうかを確認したり、同時ジェスチャを有効にすることができますが、うまくいきませんでした。私の考えは代わりに使用することでした2本の指が挟まれると、3本を使うことができます(回転するよりもつまむほうが簡単です)。

ご存知のように、ピンチは2本の指でしか機能しません。だから、私はUIPinchGestureReconizerをサブクラス化し、画面に3本の指があるときだけ動作させることにしました。残りの部分は標準ピンチとして機能し、3番目の指を無視しても(スケールを計算するため)、まだ3番目の指が画面上に残っていることが確認されます。

だから私は、だから、(そのサブクラス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指のピンチの同じ機能を取得しようとしている(で私のThreeFingerPinchRecognizerための次の実装を試してみましたのみ[super]関数を呼び出すと、touchesBegantouchesMoved機能で、私はこれで

event.alltouches.countを見ることで)画面上の3本の指がある場合にテストしてる、回転は2本の指で完璧な作業しているが、ピンチはn私はこれを完全に間違っているかもしれないと知っているので、どんな助けも素晴らしいでしょう!!

ありがとうございました!

+0

のinterstingアプローチを、しかし、(最終的には、呼び出している)PinchGestureRecognizerはおそらく2回のタッチではない3を期待して、私は多分にしようとするだろうあなたがスーパーに電話する前に接触の一つを取り除いてください。あなたは取り除くべきものを見つけなければならないでしょう。 – Daniel

+0

私はピンチジェスチャー内で処理されていると信じていました。私はそれを転送するだけです!ピンチが正しく機能する(ただし、2本の指で) –

+0

*良い注意:3本の指の機能は、ズーム機能が設定されているユーザーのデバイスでは機能しません。 (すべてのアプリで、どのアプリでもスクリーンショット機能がどのように機能するかなどのように)ズームインすることができます)... 3つの機能を検出すると、ホームボタン検出機能を使用するのと同じくらい致命的になる可能性があります。 (私は、他の多くの人と同様に、このズーム機能を有効にしています) –

答えて

0

このスニペットuはピンチの状態を特定するのに役立ちます参照してください。

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; 
    } 
} 
関連する問題