From 43aee0ec6745b6c7f764eea37957b13ceaefb0e4 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 29 Oct 2022 11:25:51 -0400 Subject: [PATCH] Add pointer interaction to avatar in timeline status cell --- .../TimelineStatusCollectionViewCell.swift | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Tusker/Views/Status/TimelineStatusCollectionViewCell.swift b/Tusker/Views/Status/TimelineStatusCollectionViewCell.swift index e64e5fd4..200fada3 100644 --- a/Tusker/Views/Status/TimelineStatusCollectionViewCell.swift +++ b/Tusker/Views/Status/TimelineStatusCollectionViewCell.swift @@ -54,6 +54,7 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti $0.isUserInteractionEnabled = true $0.addInteraction(UIContextMenuInteraction(delegate: self)) $0.addInteraction(UIDragInteraction(delegate: self)) + $0.addInteraction(UIPointerInteraction(delegate: self)) $0.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(accountPressed))) } @@ -215,6 +216,10 @@ class TimelineStatusCollectionViewCell: UICollectionViewListCell, StatusCollecti $0.addInteraction(UIPointerInteraction(delegate: self)) } + private var actionButtons: [UIButton] { + [replyButton, favoriteButton, reblogButton, moreButton] + } + // MARK: Cell state private var mainContainerTopToReblogLabelConstraint: NSLayoutConstraint! @@ -619,21 +624,28 @@ extension TimelineStatusCollectionViewCell: UIDragInteractionDelegate { extension TimelineStatusCollectionViewCell: UIPointerInteractionDelegate { func pointerInteraction(_ interaction: UIPointerInteraction, regionFor request: UIPointerRegionRequest, defaultRegion: UIPointerRegion) -> UIPointerRegion? { - guard let button = interaction.view as? UIButton else { - return nil + if interaction.view === avatarImageView { + return defaultRegion + } else if let button = interaction.view as? UIButton, + actionButtons.contains(button) { + var rect = button.convert(button.imageView!.bounds, from: button.imageView!) + rect = rect.insetBy(dx: -24, dy: -24) + return UIPointerRegion(rect: rect) } - var rect = button.convert(button.imageView!.bounds, from: button.imageView!) - rect = rect.insetBy(dx: -24, dy: -24) - return UIPointerRegion(rect: rect) + return nil } func pointerInteraction(_ interaction: UIPointerInteraction, styleFor region: UIPointerRegion) -> UIPointerStyle? { - guard let button = interaction.view as? UIButton else { - return nil + if interaction.view === avatarImageView { + let preview = UITargetedPreview(view: avatarImageView) + return UIPointerStyle(effect: .lift(preview)) + } else if let button = interaction.view as? UIButton, + actionButtons.contains(button) { + let preview = UITargetedPreview(view: button.imageView!) + var rect = button.convert(button.imageView!.bounds, from: button.imageView!) + rect = rect.insetBy(dx: -8, dy: -8) + return UIPointerStyle(effect: .highlight(preview), shape: .roundedRect(rect)) } - let preview = UITargetedPreview(view: button.imageView!) - var rect = button.convert(button.imageView!.bounds, from: button.imageView!) - rect = rect.insetBy(dx: -8, dy: -8) - return UIPointerStyle(effect: .highlight(preview), shape: .roundedRect(rect)) + return nil } }