2011-09-09 5 views
8

Ho una vista con diversi UIButtons. Ho implementato con successo utilizzando UILongPressGestureRecognizer con il seguente come selettore;Su un UILongPressGestureRecognizer come posso rilevare quale oggetto ha generato l'evento?

- (void)longPress:(UILongPressGestureRecognizer*)gesture { 
    if (gesture.state == UIGestureRecognizerStateEnded) { 
     NSLog(@"Long Press"); 
    } 
} 

Quello che ho bisogno di sapere all'interno di questo metodo è che UIButton ha ricevuto il longpress da quando ho bisogno di fare qualcosa di diverso, a seconda di quale pulsante ha ricevuto il longpress.

Speriamo che la risposta non sia un problema di mappatura delle coordinate di dove il longpress si è verificato ai limiti dei pulsanti - preferirei non andare lì.

Qualche suggerimento?

Grazie!

risposta

10

Disponibile in gesture.view.

1

Se la vista contiene più subviews (come un sacco di pulsanti) è possibile determinare ciò che è stato sfruttato:

// Get the position of the point tapped in the window co-ordinate system 
CGPoint tapPoint = [gesture locationInView:nil]; 

UIView *viewAtBottomOfHeirachy = [self.window hitTest:tapPoint withEvent:nil]; 

if ([viewAtBottomOfHeirachy isKindOfClass:[UIButton class]]) 
3

State aggiungendo lungo regolatore gesto di rubinetto al UIView che ha le UIButtons come subviews? Se è così, qualcosa sulla falsariga dell'approccio di @Magic Bullet Dave è probabilmente la strada da percorrere.

Un'alternativa è quella di sottoclasse UIButton e aggiungere a ogni UIButton un longTapGestureRecogniser. È quindi possibile ottenere il pulsante per fare ciò che ti piace. Ad esempio, potrebbe inviare un messaggio che si identifica con un controller di visualizzazione. Il seguente frammento illustra i metodi per la sottoclasse.

- (void) setupLongPressForTarget: (id) target; 
{ 
    [self setTarget: target]; // property used to hold target (add @property and @synthesise as appropriate) 

    UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:button action:@selector(longPress:)]; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 

- (void) longPress: (UIGestureRecognizer*) recogniser; 
{ 
    if (![recogniser isEnabled]) return; // code to prevent multiple long press messages 
    [recogniser setEnabled:NO]; 
    [recogniser performSelector:@selector(setEnabled:) withObject: [NSNumber numberWithBool:YES] afterDelay:0.2]; 

    NSLog(@"long press detected on button"); 

    if ([[self target] respondsToSelector:@selector(longPressOnButton:)]) 
    { 
     [[self target] longPressOnButton: self]; 
    } 
} 

Nel vostro controller della vista si potrebbe avere il codice qualcosa di simile:

- (void) viewDidLoad; 
{ 
    // set up buttons (if not already done in Interface Builder) 

    [buttonA setupLongPressForTarget: self]; 
    [buttonB setupLongPressForTarget: self]; 

    // finish any other set up 
} 

- (void) longPressOnButton: (id) sender; 
{ 
    if (sender = [self buttonA]) 
    { 
     // handle button A long press 
    } 

    if (sender = [self buttonB]) 
    { 
     // handle button B long press 
    } 

    // etc. 

} 
+0

if ([[target auto] respondsToSelector: @selector (longPressOnButton :)]) { [[target auto] longPressOnButton: self]; } questo if-block non si compila ... ha dato un errore come: nessun metodo di istanza noto come ... – trillions

+0

L'ho capito ... ha aggiunto un protocollo ed è stato corretto. Grazie.. – trillions

Problemi correlati