Long Press — жест долгого нажатия, при котором палец удерживается на экране в течение определённого времени (обычно 0,5–1 секунда) без перемещения. В отличие от Tap, Long Press распознаётся не в момент касания, а после истечения таймера задержки. Жест используется для вызова контекстного меню, предварительного просмотра, выбора нескольких объектов и активации дополнительных действий. Реализуется на iOS через UILongPressGestureRecognizer, на Android — через setOnLongClickListener или GestureDetector.
Главное
Long Press (долгое нажатие, долгое касание) — жест мультитач-интерфейса, при котором пользователь касается экрана и удерживает палец неподвижно в течение заданного времени. Система не реагирует мгновенно: она ожидает таймаут (обычно 500 мс), и только после его истечения распознаёт жест как Long Press. Если палец отпущен раньше — жест интерпретируется как обычное нажатие Tap.
Жест является фундаментальным строительным блоком современных мобильных интерфейсов. Apple использует его для вызова контекстных меню в приложениях (Messages, Safari, Files). Google внедрил Long Press в систему выделения текста, перемещения иконок на рабочем столе и вызова контекстных меню в Android. В веб-интерфейсах долгое нажатие часто эмулирует правый клик мыши на мобильных устройствах, где нет физической правой кнопки.
Исторически Long Press появился как альтернатива контекстному меню (правый клик) для сенсорных экранов. Первые реализации встречаются в устройствах с резистивными экранами (Palm, Windows Mobile начала 2000-х), но стандартизировался жест только с появлением iPhone и Android. Human Interface Guidelines обеих платформ описывают Long Press как вторичное действие — не замену Tap, а расширение функциональности.
Long Press и Tap — два разных жеста с разной семантикой. Tap (касание) — это мгновенное нажатие: палец касается экрана и отпускается за 100–300 мс. Tap всегда является основным действием (primary action): открыть приложение, нажать кнопку, перейти по ссылке. Long Press — вторичное действие (secondary action): открыть контекстное меню, начать редактирование, показать дополнительную информацию.
| Параметр | Tap | Long Press |
|---|---|---|
| Время удержания | 100–300 мс | 500–1000 мс |
| Тип действия | Основное (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, для accessibility рекомендуется 0.65+); allowableMovement — максимальное смещение пальца в точках (стандартно 10, увеличение помогает при тряске). iOS поддерживает numberOfTouchesRequired для мультитач-жестов (например, долгое нажатие двумя пальцами). Распознаватель также интегрируется с UIContextMenuInteraction — при добавлении context menu к UIView через UIContextMenuConfiguration, Long Press автоматически вызывает контекстное меню без ручной реализации жеста.
setOnLongClickListener — метод View в Android SDK, который устанавливает слушатель долгого нажатия. Когда пользователь удерживает View более 500 мс, система вызывает 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 использует долгое нажатие на иконку для перемещения приложений и добавления виджетов.
Выделение текста — классический пример 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 interaction требует долгого нажатия для старта перетаскивания.
Human Interface Guidelines обеих платформ дают чёткие рекомендации: Long Press всегда должен быть вторичным действием. Никогда не делайте долгое нажатие единственным способом выполнения критической функции. Пользователи сначала пробуют Tap — если Tap не срабатывает ожидаемым образом, они разочаровываются. Добавляйте визуальные подсказки: контекстные меню могут быть обозначены иконкой троеточия, а элементы, поддерживающие Long Press, — визуальным намёком при касании.
Тактильная обратная связь обязательна для Long Press. Когда жест распознан, устройство должно подтвердить это тактильным откликом: в iOS это UIImpactFeedbackGenerator с лёгким импульсом, в Android — HapticFeedbackConstants.LONG_PRESS. Без тактильной обратной связи пользователь не уверен, что жест сработал, и может повторно нажать, вызывая нежелательные действия.
| Рекомендация | iOS | Android |
|---|---|---|
| Таймаут распознавания | 0.5–0.65 секунды | 500 мс (по умолчанию) |
| Тактильный отклик | 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 мс) на обеих платформах. iOS позволяет настроить minimumPressDuration от 0.3 до 1.0 секунды. Android использует фиксированный таймаут 500 мс для View.setOnLongClickListener. Для пользователей с ограниченной моторикой рекомендуется увеличить таймаут до 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. Если пользователь начинает движение пальца до таймаута — жест отменяется в пользу прокрутки.
Да, 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также