2013-07-18 11 views
9

Ho un problema in cui il mio UITapGestureRecognizer sul mio UILabels in una vista di contenuto nel mio UIScrollView non chiama i suoi metodi.UITapGestureRecognizer su UILabels nella sottoview di UIScrollView non funziona

La gerarchia della vista è la seguente:

  • ScrollView (UIScrollView)
    • contentView (UIView)
      • testLabel (UILabel) - qui è dove è collegato l'UITapGestureRecognizer

ho distillato il codice verso il basso per un esempio per evidenziare il problema

// Set scrollview size - Added in Storyboad 
[scrollView setContentSize:CGSizeMake([arrayOfVerbs count]*self.view.frame.size.width, scrollView.contentSize.height)]; 
[scrollView setCanCancelContentTouches:YES]; // Tried both yes and no 
[scrollView setPagingEnabled:YES]; 

// Add content view 
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)]; 
[scrollView addSubview:contentView]; 

// Add test UILabel 
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 100)]; 
[testLabel setBackgroundColor:[UIColor redColor]]; 
[testLabel setText:@"Test touch"]; 
[testLabel setUserInteractionEnabled:YES]; 
[contentView addSubview:testLabel]; 

// Add gesture recogniser 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playSound:)]; 
singleTap.numberOfTapsRequired = 1; 
[testLabel addGestureRecognizer:singleTap]; 

E questo è il metodo che il gesto riconoscitore rubinetto deve chiamare

- (void)playSound:(UITapGestureRecognizer *)sender { 

    NSLog(@"play sound"); 

    if(sender.state == UIGestureRecognizerStateEnded) 
    { 
     int pronounNumber = [sender.view tag]; 
     int exampleNumber = (int)sender.view.frame.origin.x%(int)self.view.frame.size.width; 

     NSLog(@"Pronoun is %i and example is %i", pronounNumber, exampleNumber); 
    } 
} 

Questo metodo non viene mai chiamato quando ho ho provato a toccare UILabel.

Ho provato a impostare la proprietà canCancelContentTouches su SÌ e NO sulla vista di scorrimento come suggerito da questo thread, ma non funziona ancora.

La cosa strana è che se aggiungo un UILabel al di fuori di scrollView, il riconoscitore di gesti funziona! Quindi il problema si verifica solo nel mio contentView che è una sottoview del mio scrollView.

Sto usando il layout automatico, se questa potrebbe essere una differenza?

Grazie!

+2

Provare a impostare [contentView setClipBounds: YES]; e vedere se il tuo 'Label' all'interno del' ContentView' è visibile, se non è il tuo 'Label' non è in contatto, aggiustare le proprietà di ridimensionamento .. – iphonic

risposta

10

La vista di scorrimento ha anche un riconoscimento di gesti. Per impostazione predefinita, solo un riconoscitore di gesti può gestire i tocchi in qualsiasi momento. È necessario farsi delegare il proprio gesto e quindi implementare gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: per restituire YES. Ciò gli consentirà di funzionare contemporaneamente alla visualizzazione di scorrimento.

+0

OK, quindi ho impostato 'singleTap.delegate = self;' e ho implementato 'UIGestureRecognizerDelegate' nel mio file .h, e ho aggiunto' gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: ', ma ancora non funziona. –

+2

Viene chiamato il metodo delegato? Qual è la dimensione della vista del contenuto (registrarla)? – Wain

+1

OMG! Avete capito bene! era 'contentView size

2

Aggiungi delegato tagGestures,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playSound:)]; 
singleTap.numberOfTapsRequired = 1; 
singleTap.delegate = self; 
[testLabel addGestureRecognizer:singleTap]; 

EDIT: -

contentView.userInteractionEnabled = YES; 

mettere questa riga il codice di lavoro it'l.

+0

@Joseph Williamson: una volta la mia parte modificata. – Balu

+0

Ciao, ho appena provato ad impostare il delegato su se stesso e implementato il protocollo e - '(BOOL) gestureRecognizer: (UIGestureRecognizer *) gestureRecognizer dovrebbeReceiveTouch: (UITouch *) metodo touch'.Ancora non funziona, anche perché dovrei implementare un delegato per questo quando non ne ho bisogno per UILabels al di fuori della scrollview? –

+0

@Joseph Williamson: hai aggiunto l'ultima riga di codice nella mia risposta? Una volta aggiungilo e controlla. – Balu

-3
[yourlabel.addGestureRecognizer:tapGestureDeFromage]; 

dovrebbe aggiungere il gesto esplicitamente alle etichette.

Problemi correlati