@@ -27,6 +27,9 @@ @implementation RNSelectableTextView
27
27
28
28
NSString *const CUSTOM_SELECTOR = @" _CUSTOM_SELECTOR_" ;
29
29
30
+ UITextPosition *selectionStart;
31
+ UITextPosition* beginning;
32
+
30
33
- (instancetype )initWithBridge : (RCTBridge *)bridge
31
34
{
32
35
if (self = [super initWithBridge: bridge]) {
@@ -48,6 +51,8 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge
48
51
_backedTextInputView.selectable = YES ;
49
52
_backedTextInputView.contextMenuHidden = YES ;
50
53
54
+ beginning = _backedTextInputView.beginningOfDocument ;
55
+
51
56
for (UIGestureRecognizer *gesture in [_backedTextInputView gestureRecognizers ]) {
52
57
if (
53
58
[gesture isKindOfClass: [UIPanGestureRecognizer class ]]
@@ -62,7 +67,8 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge
62
67
[self addSubview: _backedTextInputView];
63
68
64
69
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc ] initWithTarget: self action: @selector (handleLongPress: )];
65
-
70
+
71
+
66
72
UITapGestureRecognizer *tapGesture = [ [UITapGestureRecognizer alloc ] initWithTarget: self action: @selector (handleTap: )];
67
73
tapGesture.numberOfTapsRequired = 2 ;
68
74
@@ -128,15 +134,29 @@ -(void) handleSingleTap: (UITapGestureRecognizer *) gesture
128
134
129
135
-(void ) handleLongPress : (UILongPressGestureRecognizer *) gesture
130
136
{
137
+
131
138
CGPoint pos = [gesture locationInView: _backedTextInputView];
132
139
pos.y += _backedTextInputView.contentOffset .y ;
133
-
140
+
134
141
UITextPosition *tapPos = [_backedTextInputView closestPositionToPoint: pos];
135
142
UITextRange *word = [_backedTextInputView.tokenizer rangeEnclosingPosition: tapPos withGranularity: (UITextGranularityWord) inDirection: UITextLayoutDirectionRight];
136
143
137
- UITextPosition* beginning = _backedTextInputView.beginningOfDocument ;
138
-
139
- UITextPosition *selectionStart = word.start ;
144
+
145
+ switch ([gesture state ]) {
146
+ case UIGestureRecognizerStateBegan:
147
+ selectionStart = word.start ;
148
+ break ;
149
+ case UIGestureRecognizerStateChanged:
150
+ break ;
151
+ case UIGestureRecognizerStateEnded:
152
+ selectionStart = nil ;
153
+ [self _handleGesture ];
154
+ return ;
155
+
156
+ default :
157
+ break ;
158
+ }
159
+
140
160
UITextPosition *selectionEnd = word.end ;
141
161
142
162
const NSInteger location = [_backedTextInputView offsetFromPosition: beginning toPosition: selectionStart];
@@ -146,7 +166,7 @@ -(void) handleLongPress: (UILongPressGestureRecognizer *) gesture
146
166
147
167
[_backedTextInputView select :self ];
148
168
[_backedTextInputView setSelectedRange: NSMakeRange (location, endLocation - location)];
149
- [ self _handleGesture ];
169
+
150
170
}
151
171
152
172
-(void ) handleTap : (UITapGestureRecognizer *) gesture
@@ -215,6 +235,7 @@ - (BOOL)canBecomeFirstResponder
215
235
216
236
- (BOOL )canPerformAction : (SEL )action withSender : (id )sender
217
237
{
238
+ if (selectionStart != nil ) {return NO ;}
218
239
NSString *sel = NSStringFromSelector (action);
219
240
NSRange match = [sel rangeOfString: CUSTOM_SELECTOR];
220
241
@@ -226,28 +247,7 @@ - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
226
247
227
248
- (UIView *)hitTest : (CGPoint )point withEvent : (UIEvent *)event
228
249
{
229
- if (!_backedTextInputView.isFirstResponder ) {
230
- [_backedTextInputView setSelectedTextRange: nil notifyDelegate: true ];
231
- } else {
232
- UIView *sub = nil ;
233
- for (UIView *subview in self.subviews .reverseObjectEnumerator ) {
234
- CGPoint subPoint = [subview convertPoint: point toView: self ];
235
- UIView *result = [subview hitTest: subPoint withEvent: event];
236
-
237
- if (!result.isFirstResponder ) {
238
- NSString *name = NSStringFromClass ([result class ]);
239
-
240
- if ([name isEqual: @" UITextRangeView" ]) {
241
- sub = result;
242
- }
243
- }
244
- }
245
-
246
- if (sub == nil ) {
247
- [_backedTextInputView setSelectedTextRange: nil notifyDelegate: true ];
248
- }
249
- }
250
-
250
+ [_backedTextInputView setSelectedTextRange: nil notifyDelegate: true ];
251
251
return [super hitTest: point withEvent: event];
252
252
}
253
253
0 commit comments