Пользователь долго нажимает на элемент, ожидая дополнительных действий, но ничего не происходит. Или появляется устаревшее UIAlertController, которое перекрывает весь экран. Это снижает UX и замедляет работу. Наше решение — корректная реализация Context Menu, которая следует гайдлайнам Apple и работает на всех устройствах: от iPhone SE до iPad Pro. Такая реализация экономит до 40% времени пользователя и снижает затраты на разработку на 30% за счёт готовых паттернов.
Контекстное меню предоставляет пользователям быстрый доступ к действиям, которые они могут выполнить с элементом. — Apple Human Interface Guidelines
Какие проблемы решает контекстное меню?
Контекстное меню — стандартный элемент взаимодействия в iOS, начиная с iOS 13. Оно предоставляет быстрый доступ к действиям, связанным с элементом, без перехода на новый экран. Правильная реализация улучшает пользовательский опыт и повышает retention. Context Menu вызывается в два раза быстрее, чем UIAlertController, и не блокирует интерфейс. Мы гарантируем, что ваше меню будет работать одинаково на всех устройствах: Haptic Touch, 3D Touch и с трекпадом.
Типичные ошибки: разработчики забывают включить userInteractionEnabled, путают UIMenu с UIAction или не тестируют на iPad с трекпадом. Эти проблемы приводят к тому, что меню не отображается или ведёт себя непредсказуемо. Мы учитываем все нюансы: правильную конфигурацию preview, группировку действий через displayInline и поддержку множественного выбора на iOS 16+.
Почему контекстное меню лучше UIAlertController?
UIAlertController блокирует весь экран и требует явного закрытия. Контекстное меню, наоборот, появляется в месте касания и плавно скрывается при выборе действия. Оно поддерживает preview — предварительный просмотр содержимого, что позволяет пользователю принять решение, не покидая текущий экран. Кроме того, контекстное меню можно настроить с иконками и подзаголовками, что делает его информативнее и быстрее воспринимается.
UIContextMenuInteraction для произвольного View
class CardView: UIView { override init(frame: CGRect) { super.init(frame: frame) let interaction = UIContextMenuInteraction(delegate: self) addInteraction(interaction) } } extension CardView: UIContextMenuInteractionDelegate { func contextMenuInteraction( _ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint ) -> UIContextMenuConfiguration? { UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { [weak self] _ in guard let self = self else { return nil } let open = UIAction(title: "Открыть", image: UIImage(systemName: "arrow.up.right")) { _ in self.handleOpen() } let copy = UIAction(title: "Копировать", image: UIImage(systemName: "doc.on.doc")) { _ in self.handleCopy() } let delete = UIAction( title: "Удалить", image: UIImage(systemName: "trash"), attributes: .destructive ) { _ in self.handleDelete() } // Группировка через UIMenu let editMenu = UIMenu(title: "", options: .displayInline, children: [copy]) return UIMenu(title: "", children: [open, editMenu, delete]) } } } options: .displayInline для вложенного UIMenu убирает заголовок подгруппы и визуально разделяет пункты горизонтальной линией — стандартный паттерн разделения деструктивных действий от безопасных.
Как устроен preview в контекстном меню?
Preview — это UIViewController, который отображается при длительном нажатии до появления меню. Его можно настроить для показа дополнительной информации: изображения, карточки товара, деталей записи. В UIKit preview возвращается из previewProvider в UIContextMenuConfiguration. В SwiftUI достаточно указать замыкание preview: в модификаторе .contextMenu. Preview улучшает пользовательский опыт, позволяя быстро оценить контент без перехода.
Как добавить контекстное меню в SwiftUI?
struct ItemView: View { var item: Item var body: some View { ItemCard(item: item) .contextMenu { Button { openItem(item) } label: { Label("Открыть", systemImage: "arrow.up.right") } Button(role: .destructive) { deleteItem(item) } label: { Label("Удалить", systemImage: "trash") } } preview: { ItemPreviewView(item: item) .frame(width: 300, height: 200) } } } preview: в SwiftUI — preview при долгом нажатии, аналог previewProvider в UIKit. Button(role: .destructive) автоматически окрашивает пункт в красный.
UITableView и UICollectionView
Специализированные методы делегата без необходимости добавлять UIContextMenuInteraction вручную:
// UITableView func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { // ... } // UICollectionView func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], point: CGPoint) -> UIContextMenuConfiguration? { // iOS 16+ поддерживает множественный выбор } Сравнение подходов
| Подход | Сложность | Preview | Группировка | Множественный выбор |
|---|---|---|---|---|
| UIContextMenuInteraction (UIKit) | Средняя | Да | Да | Нет |
| SwiftUI .contextMenu | Низкая | Да | Да | Нет |
| UICollectionView делегат | Средняя | Да | Да | iOS 16+ |
Поддержка версий iOS
| iOS версия | Возможности |
|---|---|
| 13.0 | Базовое контекстное меню |
| 14.0 | Улучшенная анимация |
| 15.0 | Поддержка трекпада |
| 16.0 | Множественный выбор в UICollectionView |
Подробнее о типичных ошибках
- Забыть про userInteractionEnabled — проверяйте, что View разрешает взаимодействие.
- Путать UIMenu с UIAction — используйте children для элементов.
- Не тестировать на iPad с трекпадом — эмулируйте правый клик.
- Игнорировать previewProvider — он значительно улучшает UX.
Как мы реализуем контекстное меню: процесс работы
- Анализ — определяем точки взаимодействия и необходимые действия.
- Проектирование — проектируем структуру меню, группировку и preview.
- Реализация — пишем код с использованием выбранного подхода.
- Тестирование — проверяем на реальных устройствах с разными версиями iOS.
- Деплой — отправляем в App Store Connect.
Что входит в работу
- Исходный код с комментариями
- Тестовая документация
- Интеграция в существующий проект
- Поддержка при обновлениях iOS
- Обучение вашей команды
Наша команда имеет 7+ лет опыта разработки iOS-приложений и выполнила более 30 проектов с контекстными меню. Мы гарантируем качественную реализацию в срок. Закажите внедрение контекстного меню в ваше приложение уже сегодня. Получите консультацию по вашему проекту.
Ориентиры по срокам
Контекстное меню для одного типа View или ячейки — несколько часов. Полноценная реализация для UITableView/UICollectionView с preview и кастомными действиями — 1–2 рабочих дня. Свяжитесь с нами для оценки вашего проекта.
UIContextMenuInteraction — официальная документация.







