// Requirements: // • Links should show up properly and be tappable. // • Text should * not * be selectable. // • The long press interaction that shows the context menu should still work. final class BodyTextView : UITextView { private let snDelegate: BodyTextViewDelegate override var selectedTextRange: UITextRange? { get { return nil } set { } } init(snDelegate: BodyTextViewDelegate) { self.snDelegate = snDelegate super.init(frame: CGRect.zero, textContainer: nil) setUpGestureRecognizers() } override init(frame: CGRect, textContainer: NSTextContainer?) { preconditionFailure("Use init(snDelegate:) instead.") } required init?(coder: NSCoder) { preconditionFailure("Use init(snDelegate:) instead.") } private func setUpGestureRecognizers() { let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress)) addGestureRecognizer(longPressGestureRecognizer) let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap)) doubleTapGestureRecognizer.numberOfTapsRequired = 2 addGestureRecognizer(doubleTapGestureRecognizer) } @objc private func handleLongPress(_ gestureRecognizer: UITapGestureRecognizer) { snDelegate.handleLongPress(gestureRecognizer) } @objc private func handleDoubleTap() { // Do nothing } } protocol BodyTextViewDelegate { func handleLongPress(_ gestureRecognizer: UITapGestureRecognizer) }