Реалізація 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.







