Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // UITextView+isEditableWhenBeingDataDetectable.swift
- // Stories
- //
- // Created by Li-Heng Hsu on 15/05/2018.
- // Copyright © 2018 narrativesaw. All rights reserved.
- //
- import UIKit
- extension UITextView {
- @objc private func isTapped(_ sender: UITapGestureRecognizer) {
- let textView = sender.view as! UITextView
- let location = sender.location(in: textView)
- guard let position = textView.closestPosition(to: location) else { return }
- let styleDictionary = textView.textStyling(at: position, in: .forward) ?? [:]
- openURL: if let url = styleDictionary[NSAttributedStringKey.link.rawValue] as? URL {
- let location = offset(from: beginningOfDocument, to: position)
- if delegate?.textView?(self, shouldInteractWith: url, in: NSRange(location: location, length: 0), interaction: .invokeDefaultAction) == false {
- break openURL
- }
- UIApplication.shared.open(url)
- } else if let range = textView.textRange(from: position, to: position) {
- textView.isEditable = true
- textView.becomeFirstResponder()
- textView.selectedTextRange = range
- }
- }
- var isEditableWhenBeingDataDetectable: Bool {
- get {
- return gestureRecognizers?.contains { $0 is LHTextViewEditableWhenBeingDataDetactableHelper } ?? false
- }
- set {
- if newValue {
- if !isEditableWhenBeingDataDetectable {
- let enabler = LHTextViewEditableWhenBeingDataDetactableHelper(target: self, action: #selector(isTapped))
- addGestureRecognizer(enabler)
- }
- } else {
- if let enabler = gestureRecognizers?.first(where: { $0 is LHTextViewEditableWhenBeingDataDetactableHelper }) {
- removeGestureRecognizer(enabler)
- }
- }
- }
- }
- }
- private class LHTextViewEditableWhenBeingDataDetactableHelper: UITapGestureRecognizer {
- fileprivate override init(target: Any?, action: Selector?) {
- super.init(target: target, action: action)
- delegate = self
- NotificationCenter.default.addObserver(self, selector: #selector(didEndEditing), name: .UITextViewTextDidEndEditing, object: nil)
- }
- deinit {
- NotificationCenter.default.removeObserver(self)
- }
- @objc private func didEndEditing(notification: Notification) {
- guard (notification.object as AnyObject) === view else { return }
- (view as? UITextView)?.isEditable = false
- }
- }
- extension LHTextViewEditableWhenBeingDataDetactableHelper: UIGestureRecognizerDelegate {
- func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
- return gestureRecognizer.view?.isFirstResponder == false
- }
- }
Add Comment
Please, Sign In to add comment