Frage

Ich habe eine UIButton, die eine IBAction sowie eine UITapGestureRecognizer hat Doppel Taps zu erkennen.

Im Moment sieht es aus wie die IBAction die Erkennungs blockiert. Gibt es eine Möglichkeit, dies zu stoppen oder zu tun UITapGestureRecognizer sogar Arbeit auf Tasten? Wenn dies der Fall wäre es nicht besser, nur die Erkenner hinzufügen und die IBActions entfernen?

EDIT

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

Lösung

Sieht aus wie Sie versuchen, eine Gestenerkenner auf mehrere Tasten zu befestigen. Ein Gestenerkenner kann nur eine Ansicht in einer Zeit befestigt werden. Also in Ihrem Fall die letzte Taste Sie die Erkennungseinrichtung (Taste B1) werden Befestigung wahrscheinlich reagiert auf die Doppel-Tippen aber A1 und A2 nicht.

Erstellen Sie eine separate Erkenner für jede Taste.
Aber alle drei Erkenner kann die gleiche Aktion Methode aufrufen (handleDoubleTap:).

Wenn Sie jedoch versuchen, einen einzigen Druck auf eine Taste zu tun, wird es eine leichte Verzögerung, wie es zu sehen, wartet, wenn es der Beginn eines Doppel-Tippen ist. Es gibt Möglichkeiten, um die Verzögerung zu verringern, aber kann es nicht wert sein, wenn Sie mit der Verzögerung leben können und die Abhilfen andere Probleme bringen.

Bearbeiten
In Ihrem Kommentar, Sie sagen, Sie „erkennen soll, wenn sie gleichzeitig gedrückt werden“. Um dies zu tun, müssen Sie keine Geste Erkenner. Sie können nur die Standard-Steuerungsereignisse vorgesehen verwenden.

Als nächstes wird in IB, für jeder , haken Sie die "Touch Down" Ereignis mit buttonPressed: auf. Oder, um es zu tun programmatisch:

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

Als nächstes wird in IB, für jeder , haken Sie die "Touch Up Inside" up und " Touch Up Outside“Ereignisse mit buttonReleased:. Oder, um es zu tun programmatisch:

[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];

Als Nächstes fügen ivars, um zu verfolgen, wie viele oder welche Tasten gedrückt werden:

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

Wenn Sie gerade egal, wie viele Tasten gedrückt werden, brauchen Sie nicht die NSMutableSet.

Schließlich fügen Sie die Button und buttonReleased Methoden:

- (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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top