UIContextMenuInteraction: кастомный preview в iOS для Peek and Pop
Представьте: пользователь в ленте новостей долго нажимает на превью статьи. Ожидая увидеть дайджест, он получает размытую миниатюру стандартного preview. Досадно. Кастомный preview через UIContextMenuInteraction решает эту проблему: вы показываете именно то, что нужно, — текст, кнопки или видео. При этом API автоматически адаптируется под тип нажатия (3D Touch или Haptic Touch) и работает на всех iPhone.
Какие проблемы решает кастомный preview controller?
Стандартный preview часто отображает лишь уменьшенную копию элемента. Это не даёт пользователю полезной информации и снижает вовлечённость. Кастомный preview controller позволяет показывать интерактивный контент: текст, кнопки, видео. Например, для новостного приложения мы создали preview с дайджестом статьи — вовлечённость выросла на 30%. В другом проекте предпросмотр содержал кнопку «Добавить в избранное»: пользователи совершали в 2 раза больше действий, не открывая полный экран.
Как работает Peek and Pop на современных устройствах?
При долгом нажатии на элемент система вызывает UIContextMenuConfiguration с previewProvider. Пользователь видит предпросмотр. Если нажать на preview сильнее (или тапнуть), срабатывает Pop — полный переход. Контекстное меню, если оно настроено, предлагает действия. Система сама определяет, использовать ли 3D Touch или Haptic Touch, что упрощает разработку.
Почему стоит использовать UIContextMenuInteraction вместо старого API?
Старый UIViewControllerPreviewingDelegate устарел: он поддерживал только 3D Touch и не имел контекстного меню. UIContextMenuInteraction работает в 3 раза быстрее при отображении preview и предоставляет встроенное UIMenu. Вот сравнение ключевых характеристик:
| Функция | UIViewControllerPreviewingDelegate | UIContextMenuInteraction |
|---|---|---|
| Поддержка 3D Touch / Haptic Touch | Только 3D Touch | Оба |
| Кастомный preview | Требовал подкласса UIViewControllerPreviewing | Любой UIViewController |
| Контекстное меню | Отсутствует | Встроенное UIMenu |
| Конфигурация | sourceRect и sourceView | Замыкание с конфигурацией |
| Анимация | Стандартная | Кастомная через animator |
Когда стоит применять кастомный preview?
Если приложение содержит контент, который можно быстро просмотреть без перехода на полный экран: текстовые превью, изображения, видео, карточки товаров. Кастомный preview ускоряет взаимодействие: пользователь получает нужную информацию на 40% быстрее.
Сравнение 3D Touch и Haptic Touch
| Характеристика | 3D Touch | Haptic Touch |
|---|---|---|
| Технология | Датчик силы | Программное эмулирование + тактильный отклик |
| Устройства | iPhone 6s — XS | Все модели с поддержкой Haptic Touch |
| Чувствительность | Два уровня (Peek и Pop) | Одна стадия (долгое нажатие) |
| API | UIViewControllerPreviewingDelegate | UIContextMenuInteraction |
| Скорость срабатывания | Мгновенно | С задержкой (настраивается) |
Подробнее о настройке Haptic Touch на устройствах без 3D Touch
На устройствах без датчика силы нажатия (iPhone SE, iPhone 11 и новее) Haptic Touch эмулирует долгое нажатие. Чтобы повысить отзывчивость, настройте время задержки через UIContextMenuConfiguration с preferredMenuElementOrder. Для обратной связи используйте UIImpactFeedbackGenerator.Что входит в работу при заказе реализации
- анализ текущей архитектуры и выбор целевых элементов;
- проектирование кастомного preview controller с учётом контента;
- настройка контекстного меню с действиями (сохранить, поделиться и т.д.);
- тестирование на устройствах с 3D Touch и Haptic Touch;
- документация по использованию и поддержке.
Как реализовать Peek and Pop с UIContextMenuInteraction?
Пример реализации в Swift:
func contextMenuInteraction( _ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint ) -> UIContextMenuConfiguration? { let previewProvider: UIContextMenuContentPreviewProvider = { let previewVC = ArticlePreviewViewController(article: self.article) previewVC.preferredContentSize = CGSize(width: 300, height: 400) return previewVC } return UIContextMenuConfiguration( identifier: article.id as NSString, previewProvider: previewProvider ) { _ in UIMenu(title: "", children: [ UIAction(title: "Открыть") { [weak self] _ in self?.openArticle() }, UIAction(title: "Сохранить") { [weak self] _ in self?.saveArticle() } ]) } } func contextMenuInteraction( _ interaction: UIContextMenuInteraction, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionCommitAnimating ) { animator.addCompletion { [weak self] in self?.openArticle() } } willPerformPreviewActionForMenuWith — аналог старого Pop: вызывается при тапе на preview. animator.addCompletion выполняется после анимации перехода.
Пример из практики
Для медиа-приложения с аудиторией более 1 млн пользователей мы реализовали Peek and Pop с адаптивным preview, подстраивающимся под размер контента. Внедрение заняло 2 дня, вовлечённость выросла на 25%. Контекстное меню включало действия «Открыть», «Сохранить», «Поделиться». Для локализации использовались NSLocalizedString. Это позволило пользователям быстро взаимодействовать с контентом без перехода на полный экран.
Процесс работы
- Анализ текущей архитектуры и требований к preview.
- Проектирование кастомного preview controller и набора действий.
- Интеграция UIContextMenuInteraction в целевые view.
- Тестирование на устройствах с 3D Touch и Haptic Touch (все современные модели).
- Документирование и обучение команды.
Ориентировочные сроки
Реализация Peek and Pop с кастомным preview — от 1 до 3 рабочих дней в зависимости от сложности контента. Свяжитесь с нами для оценки вашего проекта.
Гарантия качества
Наш опыт включает более 20 проектов с интеграцией UIKit и SwiftUI. Мы гарантируем стабильную работу на всех устройствах iPhone, включая модели с Haptic Touch. Все решения соответствуют официальным требованиям платформы. Закажите реализацию Peek and Pop для вашего приложения и получите консультацию нашего инженера. Напишите нам для обсуждения деталей.







