Guest User

Untitled

a guest
May 22nd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. //
  2. // UITextView+isEditableWhenBeingDataDetectable.swift
  3. // Stories
  4. //
  5. // Created by Li-Heng Hsu on 15/05/2018.
  6. // Copyright © 2018 narrativesaw. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10.  
  11. extension UITextView {
  12.  
  13. @objc private func isTapped(_ sender: UITapGestureRecognizer) {
  14. let textView = sender.view as! UITextView
  15. let location = sender.location(in: textView)
  16. guard let position = textView.closestPosition(to: location) else { return }
  17.  
  18. let styleDictionary = textView.textStyling(at: position, in: .forward) ?? [:]
  19. openURL: if let url = styleDictionary[NSAttributedStringKey.link.rawValue] as? URL {
  20. let location = offset(from: beginningOfDocument, to: position)
  21. if delegate?.textView?(self, shouldInteractWith: url, in: NSRange(location: location, length: 0), interaction: .invokeDefaultAction) == false {
  22. break openURL
  23. }
  24.  
  25. UIApplication.shared.open(url)
  26. } else if let range = textView.textRange(from: position, to: position) {
  27. textView.isEditable = true
  28. textView.becomeFirstResponder()
  29. textView.selectedTextRange = range
  30. }
  31. }
  32.  
  33. var isEditableWhenBeingDataDetectable: Bool {
  34. get {
  35. return gestureRecognizers?.contains { $0 is LHTextViewEditableWhenBeingDataDetactableHelper } ?? false
  36. }
  37. set {
  38. if newValue {
  39. if !isEditableWhenBeingDataDetectable {
  40. let enabler = LHTextViewEditableWhenBeingDataDetactableHelper(target: self, action: #selector(isTapped))
  41. addGestureRecognizer(enabler)
  42. }
  43. } else {
  44. if let enabler = gestureRecognizers?.first(where: { $0 is LHTextViewEditableWhenBeingDataDetactableHelper }) {
  45. removeGestureRecognizer(enabler)
  46. }
  47. }
  48. }
  49. }
  50.  
  51. }
  52.  
  53. private class LHTextViewEditableWhenBeingDataDetactableHelper: UITapGestureRecognizer {
  54.  
  55. fileprivate override init(target: Any?, action: Selector?) {
  56. super.init(target: target, action: action)
  57. delegate = self
  58. NotificationCenter.default.addObserver(self, selector: #selector(didEndEditing), name: .UITextViewTextDidEndEditing, object: nil)
  59. }
  60.  
  61. deinit {
  62. NotificationCenter.default.removeObserver(self)
  63. }
  64.  
  65. @objc private func didEndEditing(notification: Notification) {
  66. guard (notification.object as AnyObject) === view else { return }
  67. (view as? UITextView)?.isEditable = false
  68. }
  69.  
  70. }
  71.  
  72. extension LHTextViewEditableWhenBeingDataDetactableHelper: UIGestureRecognizerDelegate {
  73.  
  74. func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
  75. return gestureRecognizer.view?.isFirstResponder == false
  76. }
  77.  
  78. }
Add Comment
Please, Sign In to add comment