2009-03-10 1 views
23

Ho diversi UIButton s che uso per impostare l'azione corrente quando tocco nell'area principale. Vorrei anche consentire all'utente di trascinare il pulsante direttamente nell'area principale e fare la stessa azione; in sostanza, i tocchi Began e touchMoved dovrebbero essere passati alla vista principale quando si toccano gli UIButtons, ma anche il pulsante premere azione.C'è un modo per passare i tocchi sull'iPhone?

In questo momento, ho il ritocco all'interno cambiando il controllo. L'uscita di trascinamento richiama il tocco all'interno della sezione per impostare il controllo, quindi richiama la sezione inizia a toccare per avviare l'area principale toccando l'operazione.

Tuttavia, a questo punto, i touchesMoved e touchEnded non vengono ovviamente chiamati, poiché i tocchi sono originati da UIButton.

C'è un modo per ignorare a metà i tocchi in modo che vengano passati all'area principale, ma consentirmi anche di impostare il controllo prima?

risposta

24

Nella documentazione, cercare Responder Objects and the Responder Chain

Si può "condividere" tocca tra gli oggetti inoltrando il ritocco della catena responder. Il tuo UIButton ha un risponditore/controller che riceve gli eventi UITouch, suppongo che una volta che ha preformato la sua interpretazione del messaggio restituito, il tocco è stato gestito e smaltito.

di Apple suggerisce qualcosa di simile (in base al tipo di tocco, ovviamente):

[self.nextResponder touchesBegan:touches withEvent:event];

Invece di smaltimento della manifestazione tocco è trasmesso.

Sub classificata UIButton:

MyButton.h

#import <Foundation/Foundation.h> 

@interface MyButton : UIButton { 

} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; 

@end 

MyButton.m

#import "MyButton.h" 

@implementation MyButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    printf("MyButton touch Began\n"); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Quindi, in questo caso, avrei dovuto sottoclasse UIButton di trasmettere i tocchi su, presumo? –

+0

La sottoclasse non dovrebbe essere necessaria, sarà necessario esplorare la catena un po '. La vista o il controllo che contiene il tuo pulsante sarà il prossimo risponditore nella catena. – Paxic

+1

Purtroppo non vedo come intrappolare messaggi da UIButton e passarli su UIView senza sottoclasse UIButton per ottenere effettivamente il messaggio. –

35

So che questa domanda è di due anni (e già risposto), ma comunque ...

Quando l'ho provato personalmente, i tocchi sono stati inoltrati, ma i pulsanti non si sono più comportati come pulsanti. Ho anche passato i tocchi a "super" e ora tutto va bene.

Così, per i principianti che potrebbero inciampare su questo, questo è ciò che il codice dovrebbe essere simile:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
+0

Fantastico! Stavo avendo lo stesso identico problema e questo lo ha risolto! Dato in eccesso! – EmphaticArmPump

+2

Questo metodo dovrebbe essere nella sottoclasse di UIButton? –

+1

Sì, verrebbe utilizzato in una sottoclasse di UIButton. – daveMac

17

Non c'è bisogno di creare una sottoclasse sia! Semplicemente bastone questo sulla parte superiore della vostra implementazione prima di ogni altra cosa:

#pragma mark PassTouch 

@interface UIButton (PassTouch) 
@end 

@implementation UIButton (PassTouch) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 
    [self.nextResponder touchesEnded:touches withEvent:event]; 
} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
    [self.nextResponder touchesCancelled:touches withEvent:event]; 
} 
@end 
+0

Funziona come un fascino :-) Grazie mille! –

+3

BTW potrebbe esserci ancora bisogno di sottoclasse. Per esempio, cosa succede se hai bisogno di mescolare i pulsanti che devono passare i tocchi nella stessa vista con i pulsanti che per qualche motivo non vuoi avere quella funzionalità? Quando ho provato per la prima volta ho creato una categoria su UIButton ma ho scoperto che, proprio per la ragione che ho affermato sopra, era più sicuro usare una sottoclasse, così so esattamente quando sto usando un pulsante che inoltra i tocchi. – daveMac

+1

Inoltre, dovresti fare lo stesso con 'touchesCancelled'. –