-
-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathUIResponder.swift
84 lines (72 loc) · 2.55 KB
/
UIResponder.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// UIResponder.swift
// KeyboardController
//
// Created by Kiryl Ziusko on 04/07/2024.
// Copyright © 2024 Facebook. All rights reserved.
//
import Foundation
import UIKit
@objc
public extension UIResponder {
private weak static var _currentFirstResponder: UIResponder?
static var current: UIResponder? {
UIResponder._currentFirstResponder = nil
UIApplication.shared.sendAction(#selector(findFirstResponder(sender:)), to: nil, from: nil, for: nil)
return UIResponder._currentFirstResponder
}
internal func findFirstResponder(sender _: AnyObject) {
let type = String(describing: type(of: self))
// handle `contextMenuHidden` prop - in this case the parent is considered as a first responder
// (but actually its children is an actual input), so we apply correction here and point out
// to the actual first responder (first children)
let isChildrenActuallyFirstResponder =
type == "RCTMultilineTextInputView" ||
type == "RCTSinglelineTextInputView" ||
type == "RCTTextInputComponentView"
if isChildrenActuallyFirstResponder {
UIResponder._currentFirstResponder = (self as? UIView)?.subviews[0]
} else {
UIResponder._currentFirstResponder = self
}
}
}
public extension Optional where Wrapped == UIResponder {
var reactViewTag: NSNumber {
#if KEYBOARD_CONTROLLER_NEW_ARCH_ENABLED
return ((self as? UIView)?.superview?.tag ?? -1) as NSNumber
#else
return (self as? UIView)?.superview?.reactTag ?? -1
#endif
}
var nativeID: String? {
guard let superview = (self as? UIView)?.superview else { return nil }
#if KEYBOARD_CONTROLLER_NEW_ARCH_ENABLED
if superview.responds(to: Selector(("nativeId"))) == true {
return (superview as NSObject).value(forKey: "nativeId") as? String
}
return nil
#else
return superview.nativeID
#endif
}
}
public extension Optional where Wrapped: UIResponder {
var parentScrollViewTarget: NSNumber {
var currentResponder: UIResponder? = self
while let currentView = currentResponder {
// If the current responder is a vertical, scrollable UIScrollView (excluding UITextView), return its tag
if let scrollView = currentView as? UIScrollView,
!(currentView is UITextView),
scrollView.frame.width >= scrollView.contentSize.width,
scrollView.isScrollEnabled
{
return scrollView.reactViewTag
}
// Move to the next responder in the chain
currentResponder = currentView.next
}
// UIScrollView is not found
return -1
}
}