2012-09-20 6 views
14

A quanto pare iOS 6 cerca di gestire automaticamente la situazione quando si dispone di un sistema di riconoscimento gesto e un UIButton nello stesso luogo, in corso di attivazione per lo stesso gesto.Manipolazione riconoscitori gesto iOS6

Questa nuova gestione automatica risolve il problema quando si desidera fare clic sul pulsante invece di attivare il sistema di riconoscimento gesto, ma crea un nuovo problema quando si desidera che il sistema di riconoscimento gesto di agire.

In iOS 5 è possibile implementare:

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

di trasferire l'azione al UIButton quando in un conflitto.

Questo non sembra funzionare in iOS 6. Inoltre, invertendo il comportamento di questo metodo (perché ora il UIButton ha la priorità al posto del riconoscitore di gesti) non funzionerà.


metodo completo:

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

hai un uigesturerec ognizer su un UIView che ha una visualizzazione secondaria UIButton e vuole il sistema di riconoscimento gesto per ottenere tocchi al posto del tasto? – Ahti

+0

sì. In realtà la sua una '' UITableView' con UIButtons' all'interno delle cellule, e voglio il sistema di riconoscimento gesto da attivare al posto dei pulsanti. – jturolla

+0

iOS non ha fatto tutto questo fino alla sua origine? Ho sempre avuto problemi a colpire sotto un bottone. –

risposta

6

ho fatto questo per aggirare il problema, modificare come meglio credi:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     [self MyCommonSelector];// this will work for ios 5 
     return Yes; 
} 

Add obiettivo nel pulsante in cui si dichiara quindi questo chiamerà in iOS 6:

[self.myButton addTarget:self action:@selector(MyCommonSelector) 
    forControlEvents:UIControlEventTouchUpInside]; 

Fai le tue cose con questo metodo che sarà anche chiamato sul pulsante e dal gesto devi chiamare:

-(void)MyCommonSelector 
{ 
    //Do your stuff here what you want to do with Gesture too. 
} 
0

Anche se non so il motivo per cui si dovrebbe mettere UIButtons lì se non si vuole loro di essere sfruttato, è possibile impedire di ricevere subviews tocchi sovrascrivendo il Metodo -hitTest:withEvent: della vista contenente.

-hitTest:withEvent: di default restituisce il "più lontano discendente del ricevitore nella gerarchia vista (compreso se stesso) che contiene un punto specificato" , quindi per impostazione predefinita, quando si tocca uno dei tasti, la visualizzazione contenente restituirebbe il pulsante .

L'implementazione dovrebbe essere simile a questo:

- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event { 
    if ([self pointInside:aPoint]) { 
     return self; 
    } else { 
     return nil; 
    } 
} 

Quindi, se la vostra vista del contenitore questo viene chiamato contiene il punto di tatto, se stessa e il sistema di riconoscimento gesto collegato ad esso restituisce otterrà il tocco .

Perché questa implementazione non restituisce qualsiasi visualizzazione secondaria, nessuna delle UIButtons potrà mai avere la possibilità di rispondere ai tocchi.

+0

Questa non è stata una buona idea. – jturolla

+2

Ti dispiacerebbe condividere * perché *? – Ahti

+0

Ho un pulsante nel "popup" che sto nascondendo con questo metodo. Questo pulsante non funzionerà. – jturolla

0

So che sembra semplicistico, ma hai considerato impostando la proprietà userInteractionEnabled a "NO" del UIButton? Questo dovrebbe rimuoverlo automaticamente dal test di successo e dal sistema di riconoscimento dei gesti.

+0

Questo è ora un buon percorso. – jturolla

+0

Quindi potresti contrassegnarmi come corretto? – thebarcodeproject

+0

Mi dispiace molto, questo non è un buon percorso. – jturolla