2017-07-04 1 views
2

Gibt es einen UILongPressGestureRecognizer über ein UITextField, ohne dass die Feldbearbeitung ausgelöst wird, während das Textfeld trotzdem normal bearbeitet werden kann?UILongPressGestureRecognizer über UITextField in swift

Ich habe versucht, dem UITextField einen langen Druckgesteerkenner hinzuzufügen, aber das lange Drücken scheint nur einen Bruchteil der Zeit zu funktionieren.

init(frame: CGRect, userCompany: WLUserCompany) { 
    super.init(frame: frame) 

    var textField: UITextField? 

    var longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.longPress(gesture:))) 
    textField?.addGestureRecognizer(longPress) 

    self.addSubview(textField!) 
} 


@objc func longPress(gesture: UILongPressGestureRecognizer) {    
    if gesture.state == UIGestureRecognizerState.began { 
     print("Long Press") 
    } 
} 
+0

was wollen Sie mit UITextField auf UILongPressGestureRecognizer zu tun? –

+0

@Maddy ヅ ヅ Ich möchte eine Schaltfläche neben dem UITextField auf lange drücken nur erscheinen – JoshSGman

+1

Wahrscheinlich der Standard 'UIPressGestureRecognizer' ist im Konflikt mit Ihrem' UILongPressGestureRecognizer'. Ich denke, dass Sie das Verhalten ändern können, zum Beispiel, zeigen Sie die Schaltfläche, wenn dieses 'UITextField' fokussiert ist. – Macabeus

Antwort

1

Unterklasse von UIGestureRecognizer

Geste hinzufügen
import UIKit.UIGestureRecognizerSubclass 

class TouchGestureRecognizer: UIGestureRecognizer { 

    var isLongPress: Bool = false 
    fileprivate var startDateInterval: TimeInterval = 0 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesBegan(touches, with: event) 
     state = .began 
     self.startDateInterval = Date().timeIntervalSince1970 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesEnded(touches, with: event) 
     state = .ended 
     self.isLongPress = (Date().timeIntervalSince1970 - self.startDateInterval) > 1.0 
    } 
} 

erstellen recognizer zu Ihrem textField

let gesture = TouchGestureRecognizer(target: self, action: #selector(ViewController.textFiledPressed(gesture:))) 
     self.textField?.addGestureRecognizer(gesture) 

Und jetzt können Sie in textFiledPressed(gesture:) Funktion überprüfen, ob es lange drücken oder nicht ist

func textFiledPressed(gesture: TouchGestureRecognizer) { 
    switch gesture.state { 
    case .ended: 
     if gesture.isLongPress { 
      //Do whatever you need 
     } else { 
      self.textField?.becomeFirstResponder() 
     } 

    default: break 
    } 

} 
+0

Fantastische Lösung! Vielen Dank! – JoshSGman

0

Nach bei ähnlichen SO here und here suchen und experimentieren selbst, ich glaube nicht, das möglich ist - zumindest so, wie Sie Ihre Absicht zu beschreiben.

Ich konnte eine Hintergrundansicht mit Gestensteuerung hinzufügen, aber die Geste widerspricht der Benutzerinteraktion im Textfeld. Würde eine Schaltfläche neben dem Textfeld nicht zu einer besseren Benutzererfahrung führen?

FWIW, hier ist der Code zum Hinzufügen eines Hintergrunds UIView mit einem Doppeltipp. eine lange Druck Geste hatte das gleiche Ergebnis

@IBOutlet weak var backgroundView: UIView! 
    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.myTextFieldTapped)) 
     tapGesture.numberOfTapsRequired = 2 
     backgroundView.addGestureRecognizer(tapGesture) 
    } 

    @objc func myTextFieldTapped() { 
     print("Double tapped on textField") 
    } 

Hier ist ein Bild von dem Storyboard:

enter image description here

Verwandte Themen