2010-01-13 19 views
10

Meine Anwendung hat zwei überlappende UIButtons. Die obere Schaltfläche kann manchmal deaktiviert sein. In diesem Fall scheinen jedoch alle Berührungsereignisse, die er empfängt, an die darunter liegende Ansicht weitergeleitet zu werden, was in meinem Fall die andere Schaltfläche ist.Verhindern, dass UIButton Berührungsereignisse ausgibt

Was ich brauche, ist die obere Taste, die alle Berührungen abfängt und verhindert, dass sie die untere Taste erreichen, selbst im deaktivierten Zustand (ich würde mich freuen, selbst wenn die bestimmte Aktion im deaktivierten Zustand aufgerufen wird).

Bisher habe ich versucht:

[topButton setUserInteractionEnabled:YES]; 

und

[topButton setExclusiveTouch:YES]; 

obwohl der spätere Fall ist wahrscheinlich unerwünscht, da ich immer noch die untere Schaltfläche auf Ereignisse reagieren müssen, wenn es die erste Ansicht ist angeklickt. So oder so funktioniert keiner von ihnen.

Antwort

1

eine Unterklasse der Schaltfläche Erstellen, dann diese Methoden überschreiben, so dass die Schaltfläche Ereignisse fangen, aber sie ignorieren, wenn einige Eigenschaft der Schaltfläche auf NO gesetzt ist:

touchesBegan:withEvent: 
touchesCancelled:withEvent: 
touchesEnded:withEvent: 
touchesMoved:withEvent: 

Dies sind Methoden der UIResponder.

Lassen Sie sie einfach ihre [super ...] Methode aufrufen, wenn Sie das Ereignis behandeln wollen, andernfalls rufen Sie es einfach nicht auf und kehren Sie zurück, wenn Sie möchten, dass die Ereignisse "gegessen" werden.

auch sehen dies in Fall ist es notwendig: Observing pinch multi-touch gestures in a UITableView

+0

Sieht aus wie diese Methoden nicht aufgerufen werden, wenn die Schaltfläche deaktiviert ist. –

+0

Ja, das ist, was ich dachte (weshalb ich "eine Eigenschaft" sagte), weshalb Sie entweder die zweite Methode verwenden müssen oder etwas anderes tun müssen, als die Schaltfläche zu deaktivieren. Die zweite Methode wird wahrscheinlich schmerzhaft sein, da die UIApplication (die sendEvent im Fenster aufruft) wahrscheinlich das ist, was deaktivierte UIControls ignoriert. – Nimrod

2

Was ich tat UIImageView von gleicher Größe mit UIButton knapp unter dem UIButton ist platzieren. Dann, obwohl Sie UIButton deaktivieren, geben Touch-Ereignisse UIImageView nicht weiter.

+0

Dies ist die einfachste und schnellste Lösung – codingFriend1

13

Ich habe die folgende Methode Super der Behinderten-Taste:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if (!self.watchButton.enabled && 
     [self.watchButton pointInside:[self convertPoint:point toView:self.watchButton] 
          withEvent:nil]) { 
     return nil; 
    } 
    return [super hitTest:point withEvent:event]; 
} 

Das funktioniert gut mit UITableView Zellen.

1

Ich habe es geschafft, das funktioniert, wie ich mit einer leicht modifizierten Version von @kolyuchiy Antwort oben benötigt. Ich überschrieb hitTest:withEvent: Methode in meiner UIButton Unterklasse, self zurückgegeben, wenn deaktiviert und der Punkt ist innerhalb der Ansicht der Rahmen, so dass die Berührung verbraucht wird, aber die Ereignisbehandlung der Schaltfläche wird nicht aufgerufen.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if (!self.enabled && [self pointInside:[self convertPoint:point toView:self] withEvent:event]) 
    { 
     return self; 
    } 
    return [super hitTest:point withEvent:event]; 
} 
2

Nach dem Versuch @kolyuchiy (die UIButton Verhalten außerhalb des Anwendungsbereichs ändern erfordert) und @ patrick-lynch (die einfach nicht für mich arbeiten) -Lösungen kam mit eleganter ein, die UIButton Unterklasse gilt :

private static let dummyView: UIView = { 
    let view = UIView(frame: .zero) 
    view.userInteractionEnabled = true 
    return view 
}() 

public override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    if !enabled && pointInside(point, withEvent: event) { 
     return self.dynamicType.dummyView 
    } 
    return super.hitTest(point, withEvent: event) 
} 
+1

Up vote für view.userInteractionEnabled = true. – iwill

Verwandte Themen