Domanda

Ho un'UIButton che ha un'IBAction nonché un UITapGestureRecognizer per rilevare doppi rubinetti.

Al momento sembra che l'IBAction sta bloccando il sistema di riconoscimento. Esiste un modo per fermare questo o fare UITapGestureRecognizer anche il lavoro sui pulsanti? Se è così non sarebbe meglio basta aggiungere i sistemi di riconoscimento e rimuovere le IBActions?

Modifica

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[A1 addGestureRecognizer:doubleTap];
[A2 addGestureRecognizer:doubleTap];
[B1 addGestureRecognizer:doubleTap];
È stato utile?

Soluzione

Sembra che si sta tentando di collegare un sistema di riconoscimento gesto per più pulsanti. Un riconoscitore gesto può essere collegato a una sola vista alla volta. Quindi nel tuo caso, l'ultimo pulsante si collega il sistema di riconoscimento a (tasto B1) probabilmente risponde al doppio tap, ma A1 e A2 non lo fanno.

Creare un sistema di riconoscimento separato per ogni tasto.
Ma tutti e tre i sistemi di riconoscimento possono chiamare lo stesso metodo di azione (handleDoubleTap:).

Tuttavia, quando si tenta di fare un solo tocco di un pulsante, ci sarà un leggero ritardo in quanto aspetta di vedere se è l'inizio di un doppio tap. Ci sono modi per ridurre il ritardo, ma non può essere la pena se si può vivere con il ritardo e le soluzioni alternative far apparire altre questioni.

Modifica
Nel suo commento, dici che "vuole rilevare se sono premuti allo stesso tempo". Per fare questo, non c'è bisogno di riconoscimento dei gesti. Si può solo utilizzare gli eventi di controllo standard previsti.

Avanti, in IB, per ogni pulsante , collegare l'evento "Touch Down" con buttonPressed:. Oppure, per farlo a livello di codice:

[button1 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button2 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button3 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];

Avanti, in IB, per ogni , collegare il "Touch Up Inside" e " Touch Up eventi al di fuori" con buttonReleased:. Oppure, per farlo a livello di codice:

[button1 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button2 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button3 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];

Quindi, aggiungere Ivars per tenere traccia di quante e quali tasti vengono premuti:

@property (nonatomic) int numberOfButtonsBeingTouched;
@property (strong, nonatomic) NSMutableSet *buttonsBeingTouched; //alloc + init in viewDidLoad or similar

Se hai appena cura quanti tasti vengono premuti, non è necessario il NSMutableSet.

Infine, aggiungere i metodi buttonPressed e buttonReleased:

- (IBAction)buttonPressed:(UIButton *)button {
    self.numberOfButtonsBeingTouched++;
    [self.buttonsBeingTouched addObject:button];
    //your logic here (if (self.numberOfButtonsBeingTouched == 3) ...)
}

- (IBAction)buttonReleased:(UIButton *)button {
    self.numberOfButtonsBeingTouched--;
    [self.buttonsBeingTouched removeObject:button];
    //your logic (if any needed) here
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top