2011-11-23 10 views
8

UIScrollView içinde UIView içinde bir grup UIButton s var. Kaydırma görünümüne bir musluk tanıtıcı eklemeye çalışıyorum. Dokunma tanıyıcı tetikleniyor, ancak şimdi düğmelerim çalışmıyor.iOS5 UIScrollView düğmelerine müdahale eden UITapRecognizer. Nasıl düzeltilir?

IOS5'te, UIScrollView'un bir şekilde, bir bitişi, işiniz bittikten sonra kontrol hiyerarşisine geçirebileceğini biliyorum. Bunu nasıl yapacağımı anlamaya yardımcı olan var mı?

cevap

15

UIGestureRecognizer özelliği cancelsTouchesInView değerini NO'ya ayarlayın. UIGestureRecognizer Class Reference

bir jest kabul edildiğinde dokunuşlar, bir görünüme teslim edilip etkileyen bir Boolean değeri itibaren

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                          action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[tapableView addGestureRecognizer:singleTapGestureRecognizer]; 
[singleTapGestureRecognizer release]; 

.

bu özellik (varsayılan) EVET olup alıcı onun hareketi tanıdığında

, beklemede olduklarını jest dokunuşlar görünümüne teslim ve daha önce bir touchesCancelled aracılığıyla iptal edilir dokunuşlar teslim edilmez: withEvent: mesaj görünümü 'a gönderildi. Bir jest tanıyıcı kendi hareketini tanımıyorsa veya bu özelliğin değeri YOK ise, görünüm çoklu dokunma sırasındaki tüm dokunuşları alır.

+1

- İşte bir örnek, –

+0

Bu, hem düğmenin AND hareket algılayıcısına neden olur ... – hfossli

+0

@hfossli doğru. – Till

0

Ayrıca aynı şeyi başarmak için, here belgelenmiştir UIGestureRecognizerDelegate ait gestureRecognizer:shouldReceiveTouch: yöntemi kullanabilirsiniz. Örneğin, bazı dokunuşları iptal etmek, ancak başkalarını iptal etmek istiyorsanız biraz daha esneklik sunar. Hızlı cevap için, tam olarak ne gerekli sayesinde

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 
+0

Bu aslında aynı şey değil. NO döndürürken, jest tanıyıcı dokunma işlemez. EVET döndüğünde, UIView dokunuşla baş etmez. clicksTouchesInView NO olarak ayarlanmışsa, her ikisi de, jest tanıyıcı AND görünümü dokunuşu alır. – Till

+0

Siz haklısınız. Her ikisini de gerçekleştirmek istiyorsanız, buradaki dokunma olayını potansiyel olarak ele alabilirdiniz * önce * NO döndürüyor. – john

2

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; 

    return YES; 
} 
Benim için yukarıdaki cevapların bir açılan

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; 
tapRecognizer.cancelsTouchesInView = YES; 
tapRecognizer.delegate = self; 
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; 
[self.view addGestureRecognizer:tapRecognizer]; 

çalıştı! :)

+0

Bu, jest tanıyıcının düğmede başarısız olmasını sağlar - sorunun bununla nasıl ilişkili olduğundan emin olun. – Till

+0

Evet, olacak. Benim durumumda bu istenen davranış. Soru bu noktada benim anlayışıma açık değildir. – hfossli

İlgili konular