Реализация Force Touch / Haptic Touch меню для iOS
Force Touch (iPhone 6s–X) и Haptic Touch (iPhone XR и новее) — два разных механизма, оба открывают контекстное меню при долгом нажатии или нажатии с усилием. С iOS 13 обе технологии унифицированы через UIContextMenuInteraction — одна реализация работает на всех устройствах.
UIContextMenuInteraction — правильный путь
UITableView и UICollectionView имеют встроенную поддержку через делегатные методы. Для произвольного View:
let interaction = UIContextMenuInteraction(delegate: self)
myView.addInteraction(interaction)
func contextMenuInteraction(
_ interaction: UIContextMenuInteraction,
configurationForMenuAtLocation location: CGPoint
) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
let share = UIAction(title: "Поделиться", image: UIImage(systemName: "square.and.arrow.up")) { _ in
self.shareItem()
}
let delete = UIAction(title: "Удалить", image: UIImage(systemName: "trash"),
attributes: .destructive) { _ in
self.deleteItem()
}
return UIMenu(title: "", children: [share, delete])
}
}
attributes: .destructive окрашивает пункт в красный — стандартное iOS-поведение для деструктивных действий. previewProvider — опциональный кастомный preview при долгом нажатии, без него iOS показывает автоматический скриншот View.
Для UITableView
func tableView(_ tableView: UITableView,
contextMenuConfigurationForRowAt indexPath: IndexPath,
point: CGPoint) -> UIContextMenuConfiguration? {
let item = items[indexPath.row]
return UIContextMenuConfiguration(identifier: indexPath as NSIndexPath) { [weak self] in
// Preview controller
ItemPreviewViewController(item: item)
} actionProvider: { _ in
UIMenu(title: "", children: [
UIAction(title: "Открыть") { _ in self?.openItem(item) },
UIAction(title: "Удалить", attributes: .destructive) { _ in self?.deleteItem(item) }
])
}
}
Единственная реализация, работает и на Force Touch, и на Haptic Touch, и на iPad с трекпадом (правая кнопка мыши).
Ориентиры по срокам
Реализация контекстного меню через UIContextMenuInteraction или делегатные методы UITableView/UICollectionView — в рамках одного рабочего дня, включая тестирование на устройствах с Force Touch и Haptic Touch.







