6

Kaydırma görünümü içeren bir görünüme pan jest tanıyıcı eklemeye çalışıyorum ama sanırım öncelikleriyle sorun yaşıyorum.UIPanGestureRecognizer çakışma ile kaydırma gözden geçirme

Benim küresel UIView bir UIPanGestureRecognizer böyle ayarlanmış vardır:

_bottomPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(bottomPanGestureDetected:)]; 
_bottomPanGestureRecognizer.minimumNumberOfTouches = 2; 
_bottomPanGestureRecognizer.maximumNumberOfTouches = 2; 
_bottomPanGestureRecognizer.delaysTouchesBegan = NO; 
_bottomPanGestureRecognizer.delaysTouchesEnded = NO; 

Ben tutam çeşit alttan başka görünümünü görüntülemek için bu hareketi tanımak istiyorum aşağı-yukarı.

Sorun, kaydırma görünümünün kendi pan hareketini benimkiden önce tanımasıdır.

Bu yüzden sayesinde geciktirmek için çalıştı:

[_scrollView.panGestureRecognizer requireGestureRecognizerToFail:_bottomPanGestureRecognizer]; 

Ve işe yaradı, Scrollview olay aşağı tanıyıcı kadar benim iki parmak sonra ateşlendiğinde, ama ben sadece bir parmak kullandığınızda sorun artık scrollview'de ilerleyin, scroll küçük bir gecikmeden sonra çalışır.

Bu etkinlik için gecikme olmak istemiyorum, bu mümkün mü? Herhangi bir fikir karşıladı!

Şerefe.

Cyril henüz çözülmüş değil durumda

+0

tanımak Eğer 'maximumNumberOfTouches' 1'' _scrollView.panGestureRecognizer' için 'set denediniz mi? – kovpas

+0

Evet, ancak garip bir şekilde, bu durumun göz ardı edildiği anlaşılıyor. – cyrilPA

+1

Eh, başka bir seçenek 'UIGestureRecognizerDelegate'' jestRecognizerShouldBegin: 'uygulamak ve orada dokunma sayısını kontrol etmektir. Yani iki dokunuş varsa, 'NO NO' – kovpas

cevap

7

i benim için sorun çözüldü.

İki parmakla kaydırma hareketini ve varsayılan UIScrollView davranışını (bir şeye kaydırma) hala çalışmayı algılamak için UIScrollView'a bir UIPanGestureRecognizer ekledim.

Yani ben ne UIScrollView için UIPanGestureReconizer eklemektir: Bundan sonra

UIPanGestureRecognizer *pangestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(displayReloadIndicator:)]; 
pangestureRecognizer.minimumNumberOfTouches = 2; 
pangestureRecognizer.delegate = self; 
[self.scrollView addGestureRecognizer:pangestureRecognizer]; 
[pangestureRecognizer release]; 

i kodunu ekledi: Bundan sonra

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return YES; 
} 

i tava jest tanıyıcılar eylem yöntemini uyguladı.

- (void) displayReloadIndicator:(UIPanGestureRecognizer*) panGestureRecognizer { 

    UIGestureRecognizerState gestureRecognizerState = gestureRecognizer.state; 

    CGPoint translation = [gestureRecognizer translationInView:self.scv_bibgesamt]; 

    if (gestureRecognizerState == UIGestureRecognizerStateBegan) { 

     // create a UIView with all the Pull Refresh Headers and add to UIScrollView 
     // This is really much lines of code, but its simply creating a UIView (later you'll find a myRefreshHeaderView, which is my base view) and add UIElements e.g. UIActivityIndicatorView, a UILabel and a UIImageView on it 
     // In iOS 6 you will also have the possibility to add a UIRefreshControl to your UIScrollView 

    } 

    else if (gestureRecognizerState == UIGestureRecognizerStateEnded 
      || gestureRecognizerState == UIGestureRecognizerStateCancelled) { 

     if (translation.y >= _myRefreshHeaderView.frame.size.height + 12) { // _myRefreshHeaderView is my baseview 

     //so the UIScrollView has been dragged down with two fingers over a specific point and have been release now, so we can refresh the content on the UIScrollView 
     [self refreshContent]; 

     //animatly display the refresh view as the top content of the UIScrollView 
     [self.scrollView setContentOffset:CGPointMake(0, myRefreshHeaderView.frame.size.height) animated:YES]; 
    } 

    else { 

     //the UIScrollView has not been dragged over a specific point so don't do anything (just scroll back to origin) 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 

     //remove the view (because it's no longer needed) 
     [_myRefreshHeaderView removeFromSuperview]; 
    } 
} 

GÜNCELLEME: durumda

Eğer NavigationController geri tokatlamak işlevlerini entegre isteyebilirler, kod aşağıdaki bütünleştirmektedir olmalıdır:

- (void) viewDidLoad { 

    [super viewDidLoad]; 


    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 

     self.navigationController.interactivePopGestureRecognizer.enabled = YES; 

     self.navigationController.interactivePopGestureRecognizer.delegate = nil; 
    } 

    //setup view controller 
} 

ve

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

    if (gestureRecognizer == _panGestureRecognizer 
     && [self.navigationController.viewControllers count] > 1) { 

     CGPoint point = [touch locationInView:self.view.window]; 

     if (point.x < 20 
      || point.x > self.view.window.frame.size.width - 20) { 

      return NO; 
     } 
    } 

    return YES; 
} 
+0

Teşekkürler @NicTesla – channi

+0

Rica ederim :) – NicTesla

1

panRecognizer temsilcisini e'ye uygulayın nable eşzamanlı UIScrollView UIGestureRecognizer

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if (_panRecognizer == gestureRecognizer) { 
     if ([otherGestureRecognizer.view isKindOfClass:UIScrollView.class]) { 
      UIScrollView *scrollView = (UIScrollView *)otherGestureRecognizer.view; 
      if (scrollView.contentOffset.x == 0) { 
       return YES; 
      } 
     } 
    } 

    return NO; 
}