From cfb061b388bbc7c1c4c55062d4256536c019a43f Mon Sep 17 00:00:00 2001 From: wwwcg Date: Mon, 29 Jul 2024 16:17:34 +0800 Subject: [PATCH] fix(ios): iOS18 adaptation of TextView component --- .../component/textinput/HippyTextField.h | 3 ++- .../component/textinput/HippyTextField.m | 6 +++--- .../component/textinput/HippyTextView.h | 20 ++++++++++++++----- .../component/textinput/HippyTextView.mm | 17 ++++++++++------ .../textinput/HippyTextViewManager.mm | 2 +- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/renderer/native/ios/renderer/component/textinput/HippyTextField.h b/renderer/native/ios/renderer/component/textinput/HippyTextField.h index 0b61e7c9f82..acb957fc9d3 100644 --- a/renderer/native/ios/renderer/component/textinput/HippyTextField.h +++ b/renderer/native/ios/renderer/component/textinput/HippyTextField.h @@ -32,12 +32,13 @@ @end @interface HippyUITextField : UITextField +/// iOS18's UITextInput adds an `editable` property, to avoid conflict, rename to `canEdit` +@property (nonatomic, assign) BOOL canEdit; @property (nonatomic, assign) BOOL textWasPasted; @property (nonatomic, weak) id responderDelegate; @property (nonatomic, copy) HippyDirectEventBlock onBlur; @property (nonatomic, copy) HippyDirectEventBlock onFocus; -@property (nonatomic, assign) BOOL editable; @end @interface HippyTextField : HippyBaseTextInput diff --git a/renderer/native/ios/renderer/component/textinput/HippyTextField.m b/renderer/native/ios/renderer/component/textinput/HippyTextField.m index 10137be9b6d..eaffcf17335 100644 --- a/renderer/native/ios/renderer/component/textinput/HippyTextField.m +++ b/renderer/native/ios/renderer/component/textinput/HippyTextField.m @@ -63,9 +63,9 @@ - (void)setReturnKeyType:(UIReturnKeyType) returnKeyType{ } } -- (void)setEditable:(BOOL)editable { - _editable = editable; - [self setEnabled:editable]; +- (void)setCanEdit:(BOOL)canEdit { + _canEdit = canEdit; + [self setEnabled:canEdit]; } - (void)paste:(id)sender { diff --git a/renderer/native/ios/renderer/component/textinput/HippyTextView.h b/renderer/native/ios/renderer/component/textinput/HippyTextView.h index 2a48201b8e8..0a287acd2f9 100644 --- a/renderer/native/ios/renderer/component/textinput/HippyTextView.h +++ b/renderer/native/ios/renderer/component/textinput/HippyTextView.h @@ -21,25 +21,35 @@ */ #import - #import "HippyView.h" #import "HippyBaseTextInput.h" #import "UIView+Hippy.h" -@protocol NativeRenderUITextViewResponseDelegate + +/// Response delegate of HippyUITextView +@protocol HippyUITextViewResponseDelegate @required - (void)textview_becomeFirstResponder; - (void)textview_resignFirstResponder; @end -@interface NativeRenderUITextView : UITextView + +/// UITextView's Hippy Extension +@interface HippyUITextView : UITextView +/// iOS18's UITextInput adds an `editable` property, which conflicts with the one defined in HippyUITextField. +/// For consistency, we added a canEdit property here too, which has the same meaning as editable +@property (nonatomic, assign) BOOL canEdit; +/// Indicate whether text was pasted @property (nonatomic, assign) BOOL textWasPasted; -@property (nonatomic, weak) id responderDelegate; +/// Response delegate of HippyUITextView +@property (nonatomic, weak) id responderDelegate; @end + +/// Hippy multi-line TextView component @interface HippyTextView : HippyBaseTextInput { @protected - NativeRenderUITextView *_textView; + HippyUITextView *_textView; } @property (nonatomic, assign) BOOL autoCorrect; diff --git a/renderer/native/ios/renderer/component/textinput/HippyTextView.mm b/renderer/native/ios/renderer/component/textinput/HippyTextView.mm index eb13261d753..ac1ac05cb92 100644 --- a/renderer/native/ios/renderer/component/textinput/HippyTextView.mm +++ b/renderer/native/ios/renderer/component/textinput/HippyTextView.mm @@ -21,7 +21,6 @@ */ #import "HippyTextView.h" - #import "HippyConvert.h" #import "HippyShadowText.h" #import "HippyText.h" @@ -29,7 +28,7 @@ #import "HippyTextSelection.h" #import "UIView+Hippy.h" -@implementation NativeRenderUITextView +@implementation HippyUITextView - (void)paste:(id)sender { _textWasPasted = YES; @@ -70,9 +69,15 @@ - (UIColor*)caretColor{ - (void)setCaretColor:(UIColor*)color{ self.tintColor = color; } + +- (void)setCanEdit:(BOOL)canEdit { + _canEdit = canEdit; + [self setEditable:canEdit]; +} + @end -@interface HippyTextView () +@interface HippyTextView () /// ParagraphStyle for TextView and PlaceholderView, /// used for lineHeight config and etc. @@ -130,7 +135,7 @@ - (instancetype)initWithFrame:(CGRect)frame { [self setContentInset:UIEdgeInsetsZero]; _placeholderTextColor = [self defaultPlaceholderTextColor]; _blurOnSubmit = NO; - _textView = [[NativeRenderUITextView alloc] initWithFrame:CGRectZero]; + _textView = [[HippyUITextView alloc] initWithFrame:CGRectZero]; _textView.responderDelegate = self; _textView.backgroundColor = [UIColor clearColor]; _textView.textColor = [UIColor blackColor]; @@ -557,7 +562,7 @@ static BOOL findMismatch(NSString *first, NSString *second, NSRange *firstRange, return YES; } -- (BOOL)textView:(NativeRenderUITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { +- (BOOL)textView:(HippyUITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if (_onKeyPress) { NSString *resultKey = text; if ([text isEqualToString:@" "]) { @@ -627,7 +632,7 @@ - (BOOL)textView:(NativeRenderUITextView *)textView shouldChangeTextInRange:(NSR return YES; } -- (void)textViewDidChangeSelection:(NativeRenderUITextView *)textView { +- (void)textViewDidChangeSelection:(HippyUITextView *)textView { if (_onSelectionChange && textView.selectedTextRange != _previousSelectionRange && ![textView.selectedTextRange isEqual:_previousSelectionRange]) { _previousSelectionRange = textView.selectedTextRange; diff --git a/renderer/native/ios/renderer/component/textinput/HippyTextViewManager.mm b/renderer/native/ios/renderer/component/textinput/HippyTextViewManager.mm index 2b7892b1fad..3842dd9777c 100644 --- a/renderer/native/ios/renderer/component/textinput/HippyTextViewManager.mm +++ b/renderer/native/ios/renderer/component/textinput/HippyTextViewManager.mm @@ -159,7 +159,7 @@ - (HippyShadowView *)shadowView { HIPPY_EXPORT_VIEW_PROPERTY(clearTextOnFocus, BOOL) HIPPY_REMAP_VIEW_PROPERTY(color, textView.textColor, UIColor) HIPPY_REMAP_VIEW_PROPERTY(textAlign, textView.textAlignment, NSTextAlignment) -HIPPY_REMAP_VIEW_PROPERTY(editable, textView.editable, BOOL) +HIPPY_REMAP_VIEW_PROPERTY(editable, textView.canEdit, BOOL) HIPPY_REMAP_VIEW_PROPERTY(enablesReturnKeyAutomatically, textView.enablesReturnKeyAutomatically, BOOL) HIPPY_REMAP_VIEW_PROPERTY(keyboardType, textView.keyboardType, UIKeyboardType) HIPPY_REMAP_VIEW_PROPERTY(keyboardAppearance, textView.keyboardAppearance, UIKeyboardAppearance)