2012-12-21 29 views
6

3 parmak tutamı uygulamak için bazı sorunlar yaşıyorum.Üç parmak tutamı hareketi

2 parmak döndürme özelliğine sahip 2 parmak tutamını tek tek kullanıyorum! (eşzamanlı bir harekete ihtiyaç duyulmadı ya da istenmedi) problem, birçok kez sistemin yanlış hareketi tanımlamasıdır çünkü her ikisi de çok benzerdir, bu yüzden sistemi tanımlamayı denemek için parmaklarımı çıkarmak ve tekrar basmak zorunda kalırım. döndürme (genellikle, ilk önce tutamı tanımlar)

delayBegin'un yardımcı olup olmayacağını görmek için çok fazla aradım ya da eşzamanlı hareketi etkinleştiren bir şey yapabilseydim, ancak hiçbiri işe yaramadı, bu yüzden benim fikrim kullanmak yerine 2 parmak kıstırmak için 3 kullanabilirim (çünkü döndürmekten daha kolay olduğu için).

Sorun şu ki, bildiğiniz gibi, Pinch yalnızca 2 parmakla çalışır. Bu yüzden, UIPinchGestureReconizer'u alt sınıflara ayırabileceğime ve sadece ekranda 3 parmak olduğunda çalışmasına izin vereceğime karar verdim. Kalan standart tutam olarak çalışabiliyor, üçüncü parmağı bile görmezden geliyor (ölçeği hesaplamak için) ancak üçüncü parmağın hala ekranda kaldığından emin oluyor.

Yani gördüğünüz gibi, ben (2 parmak çimdik aynı işlevselliği almaya çalışıyorum,

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

Yani benim ThreeFingerPinchRecognizer (yani alt sınıfları UIPinchGestureRecognizer) için aşağıdaki uygulanmasını çalıştı sadece [super] işlevlerini çağıran ve touchesBegan ve touchesMoved fonksiyonları, ben Bununla

(event.alltouches.count bakarak) ekranda 3 parmak varsa test ediyorum, rotasyon iki parmakla mükemmel çalışıyor, ancak çimdik n ot çok iyi çalışıyor, onu etkinleştirmek zor ve ne zaman, iki parmak tutam gibi çalışmıyor ...

Bu tamamen yanlış yapıyor olabilirsiniz, bu yüzden herhangi bir yardım harika olacak!

Çok teşekkür ederim!

+0

Intersting yaklaşımla, ama (sonunda sen çağırıyoruz) PinchGestureRecognizer muhtemelen 2 dokunuşlar değil 3 bekliyor, belki çalışacaktı süper aramadan önce dokunuşlardan birini çıkarın ... hangisinin kaldırılacağını anlamanız gerekecek .. – Daniel

+0

Bunun PinchGesture içinde ele alındığına inanıyorum, çünkü olayda hiçbir şeyi değiştirmiyorum, Sadece iletiyorum! "if" ı kaldırırsam, çimdik doğru çalışır (ancak 2 parmakla) –

+0

* İyi bir not: 3 parmak özelliği, ayarlarda yakınlaştırma etkinleştirilmiş olan aygıtlarda çalışmaz (3 ile ekrana iki kez dokunduğunuz bir Apple özelliği Yakınlaştırmak için parmaklar (herhangi bir uygulamada, ekran görüntüsünün özelliği herhangi bir uygulamada nasıl çalıştığı gibi)) ... Uygulama yeteneği için 3 daha ince bir algılama kullanmak, bir ev düğmesi algılama özelliği kullanmak kadar ölümcül olabilir. (Ben, diğerlerinin yanında bu zoom özelliği etkin durumda) –

cevap

0

bu Parçacığı u tutam State belirlemenize yardımcı olabilir Bkz:

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; 
    } 
} 
İlgili konular