Контекстные меню в iOS: SwiftUI, UIKit, примеры кода

Пользователи ожидают быстрых действий при долгом нажатии, но часто сталкиваются с устаревшими диалогами или отсутствием реакции. Мы разрабатываем контекстные меню на SwiftUI и UIKit, которые следуют гайдлайнам Apple и работают на всех устройствах. Наша команда реализует проект под ключ — от проектирования до внедрения, обеспечивая стабильную работу и последующую поддержку.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Контекстные меню в iOS: SwiftUI, UIKit, примеры кода
Простой
~1 день
Часто задаваемые вопросы

Пользователь долго нажимает на элемент, ожидая дополнительных действий, но ничего не происходит. Или появляется устаревшее 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.

Как мы реализуем контекстное меню: процесс работы

  1. Анализ — определяем точки взаимодействия и необходимые действия.
  2. Проектирование — проектируем структуру меню, группировку и preview.
  3. Реализация — пишем код с использованием выбранного подхода.
  4. Тестирование — проверяем на реальных устройствах с разными версиями iOS.
  5. Деплой — отправляем в App Store Connect.

Что входит в работу

  • Исходный код с комментариями
  • Тестовая документация
  • Интеграция в существующий проект
  • Поддержка при обновлениях iOS
  • Обучение вашей команды

Наша команда имеет 7+ лет опыта разработки iOS-приложений и выполнила более 30 проектов с контекстными меню. Мы гарантируем качественную реализацию в срок. Закажите внедрение контекстного меню в ваше приложение уже сегодня. Получите консультацию по вашему проекту.

Ориентиры по срокам

Контекстное меню для одного типа View или ячейки — несколько часов. Полноценная реализация для UITableView/UICollectionView с preview и кастомными действиями — 1–2 рабочих дня. Свяжитесь с нами для оценки вашего проекта.

UIContextMenuInteraction — официальная документация.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714