     }
     
     open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
-        // Any taps that don't hit a link are ignored and passed to the next 
+        // Any taps that don't hit a link are ignored and passed to the next
         // responder.
         return linkRangeAtPoint(point) != nil
     }
     
-    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
-        if let touch = touches.first {
-            tappedLinkRange = linkRangeAtPoint(touch.location(in: self))
-            setNeedsDisplay()
-        }
-    }
-    
-    open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
-        tappedLinkRange = nil
-        setNeedsDisplay()
-    }
-    
-    open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
-        tappedLinkRange = nil
-        setNeedsDisplay()
-    }
-    
     @objc fileprivate func handleTap(_ gestureRecognizer: UIGestureRecognizer) {
+        switch gestureRecognizer.state {
+        case .ended:
+            tappedLinkRange = linkRangeAtPoint(gestureRecognizer.location(ofTouch: 0, in: self))
+        default:
+            tappedLinkRange = nil
+        }
+        
         if let linkRange = tappedLinkRange {
             delegate?.linkLabel?(self, didTapLinkWithURL: linkRange.URL)
+            tappedLinkRange = nil
         }
     }
     
     @objc fileprivate func handleLongPress(_ gestureRecognizer: UIGestureRecognizer) {
+        switch gestureRecognizer.state {
+        case .began:
+            tappedLinkRange = linkRangeAtPoint(gestureRecognizer.location(ofTouch: 0, in: self))
+        default:
+            tappedLinkRange = nil
+        }
+        
         if let linkRange = tappedLinkRange {
             delegate?.linkLabel?(self, didLongPressLinkWithURL: linkRange.URL)
         }

    @objc optional func linkLabel(_ label: INDLinkLabel, attributesForURL URL: URL, originalAttributes: [String: AnyObject], proposedAttributes: [String: AnyObject]) -> [String: AnyObject]
}

/// A simple UILabel subclass that allows for tapping and long pressing on links 
/// (i.e. anything marked with `NSLinkAttributeName`)
@IBDesignable open class INDLinkLabel: UILabel {
    @IBOutlet open weak var delegate: INDLinkLabelDelegate?

        static let Color = UIColor.blue
        static let UnderlineStyle = NSUnderlineStyle.styleSingle
    }
    
    fileprivate func processLinks() {
        var ranges = [LinkRange]()
        if let attributedText = attributedText {
