Long Press — η χειρονομία παρατεταμένου πατήματος, κατά την οποία το δάχτυλο κρατιέται στην οθόνη για καθορισμένο χρόνο (συνήθως 0,5–1 δευτερόλεπτο) χωρίς κίνηση. Σε αντίθεση με το Tap, το Long Press αναγνωρίζεται όχι τη στιγμή της αφής, αλλά μετά τη λήξη του χρονοδιακόπτη καθυστέρησης. Η χειρονομία χρησιμοποιείται για κλήση αναδυόμενου μενού, προεπισκόπηση, επιλογή πολλών αντικειμένων και ενεργοποίηση επιπρόσθετων ενεργειών. Υλοποιείται σε iOS μέσω UILongPressGestureRecognizer, σε Android — μέσω setOnLongClickListener ή GestureDetector.
Βασικά σημεία
Long Press (παρατεταμένο πάτημα, παρατεταμένη αφή) — μια χειρονομία διεπαφής πολλαπλών αφών, κατά την οποία ο χρήστης αγγίζει την οθόνη και κρατά το δάχτυλο ακίνητο για καθορισμένο χρόνο. Το σύστημα δεν αντιδρά αμέσως: περιμένει ένα timeout (συνήθως 500 ms) και μόνο μετά τη λήξη του αναγνωρίζει τη χειρονομία ως Long Press. Αν το δάχτυλο απελευθερωθεί νωρίτερα — η χειρονομία ερμηνεύεται ως συνηθισμένο Tap.
Η χειρονομία είναι ένα θεμελιώδες δομικό στοιχείο των σύγχρονων κινητών διεπαφών. Η Apple τη χρησιμοποιεί για κλήσεις αναδυόμενων μενού σε εφαρμογές (Messages, Safari, Files). Η Google εφήρμοσε το Long Press στο σύστημα επιλογής κειμένου, μετακίνησης εικονιδίων στην επιφάνεια εργασίας και κλήσεων αναδυόμενων μενού σε Android. Σε διαδικτυακές διεπαφές, το παρατεταμένο πάτημα συχνά μιμείται το δεξί κλικ του ποντικιού σε κινητές συσκευές που δεν έχουν φυσικό δεξί κουμπί.
Ιστορικά, το Long Press εμφανίστηκε ως εναλλακτική του αναδυόμενου μενού (δεξί κλικ) για οθόνες αφής. Οι πρώτες υλοποιήσεις βρίσκονται σε συσκευές με αντιστατικές οθόνες (Palm, Windows Mobile αρχές της δεκαετίας 2000), αλλά η χειρονομία τυποποιήθηκε μόνο με την έλευση iPhone και Android. Οι Κατευθυντήριες Γραμμές Διεπαφής και για τις δύο πλατφόρμες περιγράφουν το Long Press ως δευτερεύουσα ενέργεια — όχι αντικατάσταση του Tap, αλλά επέκταση της λειτουργικότητας.
Long Press και Tap — δύο διαφορετικές χειρονομίες με διαφορετική σημασιολογία. Το Tap (αφή) — είναι μια ακαριάια πίεση: το δάχτυλο αγγίζει την οθόνη και απελευθερώνεται μέσα σε 100–300 ms. Το Tap είναι πάντα η κύρια ενέργεια (primary action): άνοιγμα εφαρμογής, πάτημα κουμπιού, μετάβαση σε σύνδεσμο. Long Press — δευτερεύουσα ενέργεια (secondary action): άνοιγμα αναδυόμενου μενού, έναρξη επεξεργασίας, εμφάνιση επιπλέον πληροφοριών.
| Παράμετρος | Tap | Long Press |
|---|---|---|
| Χρόνος κρατήματος | 100–300 ms | 500–1000 ms |
| Τύπος ενέργειας | Κύρια (primary) | Δευτερεύουσα (secondary) |
| Παραδείγματα | Άνοιγμα συνδέσμου, πάτημα κουμπιού | Αναδυόμενο μενού, επεξεργασία |
| Ανατροφοδότηση | Οπτική (highlight) | Απτική (Haptic Feedback) |
| iOS API | UITapGestureRecognizer | UILongPressGestureRecognizer |
| Android API | setOnClickListener | setOnLongClickListener |
Βασικός κανόνας: μην χρησιμοποιείτε ποτέ το Long Press ως τον μοναδικό τρόπο εκτέλεσης μιας ενέργειας. Οι χρήστες αναμένουν ότι το Tap εκτελεί την κύρια ενέργεια και το Long Press ανοίγει τις επιπλέον επιλογές. Η παραβίαση αυτής της αρχής (για παράδειγμα, απαίτηση παρατεταμένου πατήματος για το άνοιγμα ενός συνδέσμου) οδηγεί σε αρνητική εμπειρία χρήστη και μείωση της προσβασιμότητας.
UILongPressGestureRecognizer — ο τυπικός ανιχνευτής χειρονομίας στο iOS SDK για το χειρισμό παρατεταμένου πατήματος. Κληρονομεί από το UIGestureRecognizer και υποστηρίζει ρύθμιση ελάχιστης διάρκειας, επιτρεπόμενης μετακίνησης δαχτύλου και αριθμού αφών. Ο ανιχνευτής μεταβαίνει στην κατάσταση UIGestureRecognizerStateBegan μετά τον χρονοδιακόπτη, στη συνέχεια σε UIGestureRecognizerStateChanged κατά την κίνηση του δαχτύλου και UIGestureRecognizerStateEnded κατά την απελευθέρωση.
// UILongPressGestureRecognizer με ρύθμιση ελάχιστης διάρκειας
class ContextMenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPress(_:))
)
// Ελάχιστος χρόνος κρατήματος: 0.5 δευτερόλεπτο
longPressRecognizer.minimumPressDuration = 0.5
// Επιτρεπόμενη μετακίνηση δαχτύλου: 10 σημεία
longPressRecognizer.allowableMovement = 10
customView.addGestureRecognizer(longPressRecognizer)
}
@objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
guard recognizer.state == .began else { return }
// Δημιουργία αναδυόμενου μενού
let location = recognizer.location(in: self.view)
ContextMenuPresenter.show(at: location)
}
}Παράμετροι ρύθμισης: minimumPressDuration — χρόνος σε δευτερόλεπτα μέχρι την ενεργοποίηση (προκαθορισμένο 0.5, για προσβασιμότητα συνιστάται 0.65+); allowableMovement — μέγιστη μετατόπιση δαχτύλου σε σημεία (προκαθορισμένο 10, η αύξηση βοηθά σε περίπτωση τρόμου). Το iOS υποστηρίζει numberOfTouchesRequired για χειρονομίες πολλαπλών αφών (για παράδειγμα, παρατεταμένο πάτημα με δύο δάχτυλα). Ο ανιχνευτής ενσωματώνεται επίσης με το UIContextMenuInteraction — όταν προστίθεται context menu σε UIView μέσω UIContextMenuConfiguration, το Long Press καλεί αυτόματα το αναδυόμενο μενού χωρίς χειροκίνητη υλοποίηση της χειρονομίας.
setOnLongClickListener — η μέθοδος View στο Android SDK που ορίζει τον ακροατή παρατεταμένου πατήματος. Όταν ο χρήστης κρατά το View για περισσότερο από 500 ms, το σύστημα καλεί την onLongClick(). Η μέθοδος επιστρέφει boolean — true σημαίνει ότι το συμβάν έχει υποβληθεί και δεν πρέπει να μεταδοθεί περαιτέρω, false — το συμβάν μπορεί να επεξεργαστεί και από άλλους ακροατές. Για πιο σύνθετη επεξεργασία (κίνηση δαχτύλου μετά την έναρξη του Long Press) χρησιμοποιείται ο GestureDetector με OnGestureListener.
// Παράδειγμα setOnLongClickListener με απτική ανατροφοδότηση
val itemView: View = findViewById(R.id.itemView)
itemView.setOnLongClickListener {
// Απτική απόκριση για επιβεβαίωση έναρξης χειρονομίας
it.performHapticFeedback(
HapticFeedbackConstants.LONG_PRESS
)
// Εμφάνιση αναδυόμενου μενού στη θέση του στοιχείου
val popup = PopupMenu(this, it)
popup.menuInflater.inflate(R.menu.context_menu, popup.menu)
popup.show()
true // Το συμβάν επεξεργάστηκε
}GestureDetector παρέχει πιο λεπτό έλεγχο επί της χειρονομίας. Σε αντίθεση με το setOnLongClickListener, ο GestureDetector ειδοποιεί για έναρξη (onLongPress), κίνηση (onScroll) και απελευθέρωση. Αυτό επιτρέπει την υλοποίηση σύνθετων σεναρίων — για παράδειγμα, έναρξη σύρσιμου μετά από παρατεταμένο πάτημα (Drag-and-Drop). Ο OnGestureListener απαιτεί την υλοποίηση έξι μεθόδων: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling.
Long Press χρησιμοποιείται σε δεκάδες σενάρια κινητών διεπαφών. Η πιο συχνή χρήση είναι το αναδυόμενο μενού: παρατεταμένο πάτημα σε μια επαφή εμφανίζει επιλογές επικοινωνίας (κλήση, μήνυμα, email), σε ένα αρχείο — επιλογές (αντιγραφή, μετακίνηση, διαγραφή), σε κείμενο — επιλογή και πρόχειρο. Ο Android Launcher χρησιμοποιεί παρατεταμένο πάτημα σε εικονίδιο για μετακίνηση εφαρμογών και προσθήκη widget.
Επιλογή κειμένου — ένα κλασικό παράδειγμα Long Press και στις δύο πλατφόρμες. Σε iOS, το παρατεταμένο πάτημα σε κείμενο ενεργοποιεί τον μεγεθυντικό φακό για τοποθέτηση δείκτη· σε μια λέξη — την επιλέγει με δείκτες. Σε Android, το παρατεταμένο πάτημα επιλέγει ολόκληρη τη λέξη και εμφανίζει τον πίνακα ενεργειών (αντιγραφή, αποκοπή, επικόλληση). Και οι δύο πλατφόρμες χρησιμοποιούν σύρσιμο των δεικτών για επέκταση της επιλογής.
Προεπισκόπηση — σε iOS, το παρατεταμένο πάτημα σε έναν σύνδεσμο στο Safari ή ένα μήνυμα στο Mail ανοίγει προεπισκόπηση περιεχομένου (peek). Σε Android, παρόμοια συμπεριφορά υλοποιείται μέσω Long Press σε ειδοποίηση (επεκτείνει την ειδοποίηση με κουμπιά ενεργειών). Οι εφαρμογές Photos χρησιμοποιούν παρατεταμένο πάτημα σε μικρογραφία για γρήγορη προεπισκόπηση εικόνας.
Drag-and-Drop συχνά εκκινείται από Long Press. Ο χρήστης κρατά το στοιχείο, το σύστημα μεταβαίνει σε λειτουργία σύρσιμου, και η κίνηση του δαχτύλου μετακινεί το στοιχείο στην οθόνη. Το Android υποστηρίζει αυτό το σενάριο μέσω View.startDragAndDrop() μετά από Long Press. Το iOS χρησιμοποιεί το UIDragInteraction, όπου η drag αλληλεπίδραση απαιτεί παρατεταμένο πάτημα για να ξεκινήσει το σύρσιμο.
Human Interface Guidelines και για τις δύο πλατφόρμες δίνουν σαφείς συστάσεις: το Long Press πρέπει να είναι πάντοτε δευτερεύουσα ενέργεια. Μην κάνετε ποτέ το παρατεταμένο πάτημα τον μοναδικό τρόπο εκτέλεσης μιας κρίσιμης λειτουργίας. Οι χρήστες δοκιμάζουν πρώτα το Tap — αν το Tap δεν λειτουργεί όπως αναμένουν, απογοητεύονται. Προσθέστε οπτικές ενδείξεις: τα αναδυόμενα μενού μπορούν να επισημαίνονται με εικονίδιο τριών τελειών, και τα στοιχεία που υποστηρίζουν Long Press — με οπτική υπόδειξη κατά την αφή.
Η απτική ανατροφοδότηση είναι υποχρεωτική για το Long Press. Όταν η χειρονομία αναγνωριστεί, η συσκευή πρέπει να το επιβεβαιώσει με απτική απόκριση: σε iOS αυτό είναι το UIImpactFeedbackGenerator με ελαφρό παλμό, σε Android — HapticFeedbackConstants.LONG_PRESS. Χωρίς απτική ανατροφοδότηση, ο χρήστης δεν είναι σίγουρος ότι η χειρονομία λειτούργησε και μπορεί να πατήσει ξανά, προκαλώντας ανεπιθύμητες ενέργειες.
| Σύσταση | iOS | Android |
|---|---|---|
| Timeout αναγνώρισης | 0.5–0.65 δευτερόλεπτα | 500 ms (προκαθορισμένο) |
| Απτική ανατροφοδότηση | UIImpactFeedbackGenerator | HapticFeedbackConstants.LONG_PRESS |
| Οπτική ανατροφοδότηση | Αναδυόμενο μενού, επισήμανση | PopupMenu, ripple animation |
| Προσβασιμότητα (Accessibility) | VoiceOver + Custom Actions | TalkBack + AccessibilityNodeInfo |
| Μέγιστη μετακίνηση δαχτύλου | allowableMovement = 10 pt | TouchSlop (προκαθορισμένο ~8 dp) |
| Σύγκρουση με κύλιση | cancelsTouchesInView = delayed | onInterceptTouchEvent + LongPress |
Προσβασιμότητα: δεν μπορούν όλοι οι χρήστες να εκτελέσουν παρατεταμένο πάτημα (άτομα με κινητικές δυσλειτουργίες, ηλικιωμένοι χρήστες). Πάντοτε παρέχετε εναλλακτικό τρόπο πρόσβασης σε ενέργειες Long Press — για παράδειγμα, μέσω ενός κουμπιού «Περισσότερα» στο πρόγραμμα ή μέσω λειτουργιών προσβασιμότητας του συστήματος (VoiceOver σε iOS, TalkBack σε Android). Για iOS, μπορούν να προστεθούν Custom Actions στο UIAccessibilityCustomAction που είναι διαθέσιμα μέσω του προγράμματος αναπαραγωγής VoiceOver.
Συχνές Ερωτήσεις
Ο τυπικός χρόνος για Long Press είναι 0,5 δευτερόλεπτο (500 ms) και στις δύο πλατφόρμες. Το iOS επιτρέπει ρύθμιση του minimumPressDuration από 0.3 έως 1.0 δευτερόλεπτο. Το Android χρησιμοποιεί σταθερό timeout 500 ms για το View.setOnLongClickListener. Για χρήστες με περιορισμένη κινητικότητα, συνιστάται η αύξηση του timeout σε 0,8–1,0 δευτερόλεπτα.
Long Press αναγνωρίζεται από τον χρόνο κρατήματος (0,5 δευτ.), 3D Touch — από τη δύναμη πίεσης (γραμμάρια πίεσης). Το 3D Touch είναι διαθέσιμο μόνο σε iPhone 6S–XR (υλική τεχνολογία Force Touch). Από το iOS 13, η Apple αντικατέστησε το 3D Touch με το Haptic Touch — μια προσομοίωση λογισμικού που λειτουργεί μέσω Long Press με απτική ανατροφοδότηση. Το Haptic Touch είναι διαθέσιμο σε όλα τα σύγχρονα iPhone και iPad.
Η σύγκρουση Long Press και κύλισης είναι συνηθισμένο πρόβλημα. Λύση: ορίστε delaysTouchesBegan = true για τον ανιχνευτή χειρονομίας σε iOS (το σύστημα δεν στέλνει το touchesBegan αμέσως, αλλά περιμένει την αναγνώριση της χειρονομίας). Σε Android, χρησιμοποιήστε το onInterceptTouchEvent που επιστρέφει false για Long Press. Εάν ο χρήστης αρχίσει να κουνάει το δάχτυλο πριν από το timeout — η χειρονομία ακυρώνεται υπέρ της κύλισης.
Ναι, το Long Press υποστηρίζεται σε εφαρμογές ιστού μέσω του συμβάντος touchstart/touchend με μέτρηση χρόνου. Τα σύγχρονα προγράμματα περιήγησης υποστηρίζουν επίσης το συμβάν contextmenu που ενεργοποιείται σε παρατεταμένο πάτημα σε κινητές συσκευές. Για συμβατότητα μεταξύ προγραμμάτων περιήγησης, χρησιμοποιήστε βιβλιοθήκες όπως hammer.js ή υλοποιήστε έναν προσαρμοσμένο ανιχνευτή μέσω setInterval στο χειριστή touchstart.
Σε iOS, η απτική ανατροφοδότηση προστίθεται μέσω UIImpactFeedbackGenerator. Καλέστε την impactOccurred() τη στιγμή που το UILongPressGestureRecognizer μεταβαίνει στην κατάσταση began. Για ελαφρά απόκριση, χρησιμοποιήστε UIImpactFeedbackGenerator(style: .light). Για πιο αισθητή — .medium. Για αναδυόμενα μενού, το iOS προσθέτει αυτόματα απτική ανατροφοδότηση μέσω UIContextMenuInteraction χωρίς επιπλέον κώδικα.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης