diff --git a/Views/TouchFallthroughTextView.swift b/Views/TouchFallthroughTextView.swift index 58948bf..b86aac0 100644 --- a/Views/TouchFallthroughTextView.swift +++ b/Views/TouchFallthroughTextView.swift @@ -5,6 +5,8 @@ import UIKit final class TouchFallthroughTextView: UITextView { var shouldFallthrough: Bool = true + private var linkHighlightView: UIView? + override init(frame: CGRect, textContainer: NSTextContainer?) { super.init(frame: frame, textContainer: textContainer) initializationActions() @@ -19,6 +21,35 @@ final class TouchFallthroughTextView: UITextView { shouldFallthrough ? urlAndRect(at: point) != nil : super.point(inside: point, with: event) } + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + + guard let touch = touches.first, + let (_, rect) = urlAndRect(at: touch.location(in: self)) else { + return + } + + let linkHighlightView = UIView(frame: rect) + + self.linkHighlightView = linkHighlightView + linkHighlightView.transform = Self.linkHighlightViewTransform + linkHighlightView.layer.cornerRadius = .defaultCornerRadius + linkHighlightView.backgroundColor = .secondarySystemBackground + insertSubview(linkHighlightView, at: 0) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + super.touchesEnded(touches, with: event) + + removeLinkHighlightView() + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + super.touchesCancelled(touches, with: event) + + removeLinkHighlightView() + } + override var selectedTextRange: UITextRange? { get { shouldFallthrough ? nil : super.selectedTextRange } set { @@ -91,10 +122,22 @@ final class TouchFallthroughTextView: UITextView { } private extension TouchFallthroughTextView { - private func initializationActions() { + static let linkHighlightViewTransform = CGAffineTransform(scaleX: 1.1, y: 1.1) + + func initializationActions() { + clipsToBounds = false textDragInteraction?.isEnabled = false textContainerInset = .zero textContainer.lineFragmentPadding = 0 linkTextAttributes = [.foregroundColor: tintColor as Any, .underlineColor: UIColor.clear] } + + func removeLinkHighlightView() { + UIView.animate(withDuration: .defaultAnimationDuration) { + self.linkHighlightView?.alpha = 0 + } completion: { _ in + self.linkHighlightView?.removeFromSuperview() + self.linkHighlightView = nil + } + } }