Implementing 3D Touch Peek and Pop for iOS App
3D Touch (iPhone 6s–X) allowed "peeking" into content without switching — Peek (light press, preview) and Pop (hard press, full transition). With iPhone XR and iOS 13, functionality moved to Haptic Touch via UIContextMenuInteraction and UIPreviewInteractionDelegate. Modern implementation via UIContextMenuInteraction works on all devices — both 3D Touch and Haptic Touch.
Modern Approach: UIContextMenuInteraction with Preview
func contextMenuInteraction(
_ interaction: UIContextMenuInteraction,
configurationForMenuAtLocation location: CGPoint
) -> UIContextMenuConfiguration? {
// Peek — custom preview controller
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: "Open") { [weak self] _ in self?.openArticle() },
UIAction(title: "Save") { [weak self] _ in self?.saveArticle() }
])
}
}
// Pop — action when tapping on preview
func contextMenuInteraction(
_ interaction: UIContextMenuInteraction,
willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration,
animator: UIContextMenuInteractionCommitAnimating
) {
animator.addCompletion { [weak self] in
self?.openArticle()
}
}
willPerformPreviewActionForMenuWith — analog of old Pop: fires when user taps on preview to open fully. animator.addCompletion executes after transition animation.
Timeline Benchmarks
Implementing Peek and Pop via UIContextMenuInteraction with custom preview controller — 1 working day. Includes testing on iPhone with 3D Touch (6s–X) and Haptic Touch (XR and newer).







