14

Es gibt eine Containeransicht und eine UITapGestureRecognizer darauf. Und es hat auch eine Unteransicht, die Art von TTTAttributedLabel.Tapping URL funktioniert nicht in TTTAttributedLabel, während es einen UITapGestureRecognizer in seinem Superview gibt

Wenn ich entfernen Gestenerkenner aus dem Behälter Ansicht, die Delegatmethode von TTTAttributedLabelDelegate

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url can be called. 

Wenn ich die Gestenerkenner auf Container Ansicht hinzufügen. Nur seine Aktionsmethode wird aufgerufen. Die Delegate-Methode TTTAttributedLabelDelegate wird nicht aufgerufen.

Jetzt muss ich die Delegate-Methode aufgerufen werden, wenn ich auf einen Link in TTTAttributedLabel tippen, und Aktionsmethode aufgerufen, wenn ich auf einen anderen Bereich der Containeransicht tippen.

Danke.

Antwort

12

Verwenden Sie diese gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch für die Erkennung Ihres Ereignisses.

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
     if ([touch.view isKindOfClass:[TTTAttributedLabel class]]) 
     { 
      return FALSE; 
     } 
     else 
     { 

     return TRUE; 
     } 
} 

können Sie auch if ([touch.view isKindOfClass:[UIControl class]]) für alle Buttons UIControl beispiels verwenden, auch mit UIGestureRecognizer erkennen. hoffe, dass diese Hilfe Ihnen

1

@ Nitins Antwort ist etwas korrekt, vorausgesetzt, Sie wollen nicht die Tippgeste zu arbeiten, wenn der Benutzer auf einen Teil Ihres Etiketts klopft, die kein Link ist. Wenn Ihr Etikettentext andere als nur die Verbindung hat, schlage ich Sie wie folgt vor:

  • eine neue Delegatmethode erstellen (wie „handleSingleTap“) in der TTTAttributedLabel.h Datei als @optional.

  • In TTTAttributedLabel.m finden Sie die touchesEnded Methode. Hier haben Sie einen if (self.activeLink) Zustand.

  • einen else Fall für diesen Zustand wie folgt an:

    else { 
    
        if ([self.delegate respondsToSelector:@selector(handleSingleTap)]) { 
    
         [self.delegate handleSingleTap];    
        } 
    } 
    
  • außer Kraft setzen diese neue Delegatmethode in Ihrer Klasse, wo Sie das Label verwenden.

Auf diese Weise, wenn der Benutzer auf einen Link tippt, nimmt die if Pflege Handhabung Link-Auswahl. Wenn ein Benutzer einen anderen Text als einen Link abtastet, ruft else die Methode in Ihrer Klasse auf (was die Zielmethode für Ihre tapGesture ist).

Entfernen Sie auch die tapGesture aus Ihrer Sicht, oder verwenden Sie den @ Nitin-Code, um NICHT auf Ihr Label zu tippen, und lassen Sie das Label selbst verarbeiten.

0

Nitin Vorschlag nicht für mich (unsicher warum) arbeiten, aber diese tat

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    if let touch = touches.first as? UITouch { 
     if touch.view !== self.myTTTAttributedLabel { 
      // Handle container view tap 
     } 
    } 
    super.touchesBegan(touches, withEvent: event) 
} 

Sie müssen auch die Gestenerkenner aus dem Behälter Ansicht entfernen und diese Wasserhähne in den Griff, wenn -Klause oben stattdessen.

7

Ich versuchte @ Nitins Lösung, aber es hat ein Problem als @ n00bProgrammer wies darauf hin.Außerdem wurde die Benutzererfahrung sehr schlecht. Ich musste mehrmals tippen, um tapGesture zu feuern, was auf einem superView hinzugefügt wurde.

Hier haben Sie eine bessere Lösung. TTTAttributedLabel hat eine nützliche Instanzmethode wie unten.

- (BOOL)containslinkAtPoint:(CGPoint)point 

Dies gibt zurück, ob an dem gegebenen Punkt ein NSTextCheckingResult gefunden wird.

Verwenden Sie das folgende Code-Snippet, dann nur Link hinzugefügt Teil des Textes wird als ein tappable Link arbeiten und der Rest des Bereichs wird Ihre tapGesture wie gewünscht auslösen. Die Benutzererfahrung ist ebenfalls hervorragend.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([yourTTTAttributedLabel containslinkAtPoint:[touch locationInView:yourTTTAttributedLabel]]) 
     return FALSE; 
    else 
     return TRUE;  
} 
2

Setzen Sie die cancelsTouchesInView-Eigenschaft des Gestenerkenners auf NO.

gestureRecognizer.cancelsTouchesInView = NO; 
+1

Dies ist viel einfacher als die angenommene Antwort. – user3352495