Ich möchte einen langen Druckknopf emulieren. Wie kann ich das tun? Ich denke, ein Timer wird benötigt. Ich sehe, UILongPressGestureRecognizer
aber wie kann ich diesen Typ verwenden?
ios
objective-c
uibutton
long-press
Andrea
quelle
quelle
if(gesture.state == UIGestureRecognizerStateBegan)
, da der Benutzer erwartet, dass etwas passiert, wenn er noch drückt (der Status Began), und nicht, wenn er loslässt (Beendet).Als Alternative zur akzeptierten Antwort kann dies in Xcode mit Interface Builder sehr einfach durchgeführt werden.
Ziehen Sie einfach einen Gestenerkenner für langes Drücken aus der Objektbibliothek und legen Sie ihn oben auf der Schaltfläche ab, auf der Sie die Aktion für langes Drücken ausführen möchten.
Verbinden Sie als Nächstes eine Aktion aus dem gerade hinzugefügten Long Press Gesture Recognizer mit Ihrem Ansichts-Controller und wählen Sie den Absender aus, der vom Typ sein soll
UILongPressGestureRecognizer
.IBAction
Verwenden Sie im Code dieses Codes Folgendes, das dem in der akzeptierten Antwort vorgeschlagenen Code sehr ähnlich ist:In Ziel-C :
Oder in Swift :
Aber ich muss zugeben, dass ich nach dem Versuch den Vorschlag von @shengbinmeng als Kommentar der akzeptierten Antwort vorziehe, die verwendet werden sollte:
In Ziel-C :
Oder in Swift :
Der Unterschied besteht darin, dass
Ended
Sie beim Heben des Fingers den Effekt des langen Drucks sehen. Mit sehenBegan
Sie den Effekt des langen Drucks, sobald der lange Druck vom System erfasst wird, noch bevor Sie den Finger vom Bildschirm heben.quelle
Schnelle Version der akzeptierten Antwort
Ich habe die zusätzliche Modifikation der Verwendung vorgenommen,
UIGestureRecognizerState.Began
anstatt.Ended
dass dies wahrscheinlich das ist, was die meisten Benutzer natürlich erwarten würden. Probieren Sie beide aus und überzeugen Sie sich selbst.quelle
Versuche dies:
Hinzufügen einer Schaltfläche
viewDidLoad:
wie untenRufen Sie nun die Gestenmethode so auf
quelle
recognizer.view.tag
gibt mir falsches Tag von UIButton angeklickt. Irgendeine Lösung?Ich denke du brauchst meine Lösung.
Sie sollten diesen Code für einmaliges Drücken haben
Fügen Sie zunächst eine lange Druckgeste zur Taste hinzu
Rufen Sie dann wiederholt ein einzelnes Presseereignis auf, wenn eine lange Druckgeste erkannt wird.
quelle
UIGestureRecognizer
dasviewWillAppear
Ereignis während des Lebenszyklus nicht hinzufügen, da bei jeder Anzeige eine weitere Gestenerkennung hinzugefügt wird. Dies sollte in einer privaten Methode erfolgen, die während der Initialisierung aufgerufen wird.Für Swift 4 muss die "func longPress" geändert werden, damit es funktioniert:
quelle
Einzeilige Antwort ohne Gesten:
[btn addTarget:self action:@selector(handleTouch:) forControlEvents:UIControlEventTouchDown | UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
Details: Dies löst Ihr Ziel bei drei Ereignissen aus: 1- Sobald der Finger die Taste berührt :
UIControlEventTouchDown
. Dies erfasst den Start langer Druckvorgänge. 2 & 3- Wenn der Benutzer den Finger hebt:UIControlEventTouchUpOutside
&UIControlEventTouchUpInside
. Dies erfasst das Ende der Benutzerpresse.Hinweis: Dies funktioniert gut, wenn Sie sich nicht um die zusätzlichen Informationen kümmern, die vom Gestenerkenner bereitgestellt werden (z. B. Ort der Berührung usw.).
Sie können bei Bedarf weitere Zwischenereignisse hinzufügen. Alle finden Sie hier https://developer.apple.com/documentation/uikit/uicontrolevents?language=objc .
In Storyboard: Verbinden Sie Ihre Schaltfläche mit den 3 Ereignissen, nicht nur mit dem Standardereignis, das Storyboard auswählt (Touch Up Inside).
quelle
Ich habe einen untergeordneten UIButton für meine App, daher habe ich meine Implementierung herausgezogen. Sie können dies zu Ihrer Unterklasse hinzufügen oder es kann genauso einfach neu codiert werden wie eine UIButton-Kategorie.
Mein Ziel war es, den langen Druck auf meine Schaltfläche zu übertragen, ohne meine View Controller mit dem gesamten Code zu überladen. Ich habe beschlossen, dass die Aktion aufgerufen werden soll, wenn der Status der Gestenerkennung beginnt.
Es kommt eine Warnung heraus, die ich nie gelöst habe. Sagt, es ist ein mögliches Leck, dachte, ich habe den Code getestet und es leckt nicht.
Um die Aktion zuzuweisen, fügen Sie diese Zeile Ihrer viewDidLoad-Methode hinzu.
Die Aktion sollte wie alle IBActions definiert werden (ohne die IBAction).
quelle
Keiner arbeitete daher Longpress - Code in Ich habe versucht , zu schreiben
IBAction
oder Button - Klick ausstoryboard
inController
anstelle des Schreibens inviewDidLoad
quelle