You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ac...@apache.org on 2018/02/11 03:41:11 UTC
incubator-weex git commit: [iOS] forbid action menu according to
configuration
Repository: incubator-weex
Updated Branches:
refs/heads/master de40fe13f -> 460b42723
[iOS] forbid action menu according to configuration
* [iOS] support input formatter
* [iOS] adjust caret of input
* [iOS] change property for copy action
* [iOS] handle delete words
* [iOS] handle delete words
* [iOS] adjust caret only when replace and match is different
* [iOS] refactor format algorithm
* [iOS] remove unused line
close #1024
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/460b4272
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/460b4272
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/460b4272
Branch: refs/heads/master
Commit: 460b42723c35708f3b646b93973526af85ac00b8
Parents: de40fe1
Author: acton393 <zh...@gmail.com>
Authored: Tue Jan 30 17:22:56 2018 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Sun Feb 11 11:39:55 2018 +0800
----------------------------------------------------------------------
.../WeexSDK/Sources/Component/WXEditComponent.m | 76 +++++++++++++++++++-
.../Sources/Component/WXTextInputComponent.h | 8 +++
.../Sources/Component/WXTextInputComponent.m | 31 ++++++--
3 files changed, 109 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/460b4272/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.m
index a0fc92b..3fff954 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.m
@@ -26,6 +26,7 @@
#import "WXAssert.h"
#import "WXComponent_internal.h"
#import "WXComponent+PseudoClassManagement.h"
+#import "WXTextInputComponent.h"
@interface WXEditComponent()
@@ -61,6 +62,13 @@
@property (nonatomic, strong) NSString *changeEventString;
@property (nonatomic, assign) CGSize keyboardSize;
+// formatter
+@property (nonatomic, strong) NSString * formatRule;
+@property (nonatomic, strong) NSString * formatReplace;
+@property (nonatomic, strong) NSString * recoverRule;
+@property (nonatomic, strong) NSString * recoverReplace;
+@property (nonatomic, strong) NSDictionary * formaterData;
+
@end
@implementation WXEditComponent
@@ -73,6 +81,7 @@ WX_EXPORT_METHOD(@selector(focus))
WX_EXPORT_METHOD(@selector(blur))
WX_EXPORT_METHOD(@selector(setSelectionRange:selectionEnd:))
WX_EXPORT_METHOD(@selector(getSelectionRange:))
+WX_EXPORT_METHOD(@selector(setTextFormatter:))
- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
{
@@ -225,6 +234,34 @@ WX_EXPORT_METHOD(@selector(getSelectionRange:))
}
}
+- (void)setTextFormatter:(NSDictionary*)formater
+{
+ _formaterData = formater;
+ if (formater[@"formatRule"]) {;
+ _formatRule = [self _preProcessInputTextFormatter:[WXConvert NSString:formater[@"formatRule"]]];
+ }
+ if (formater[@"formatReplace"]) {
+ _formatReplace = [self _preProcessInputTextFormatter:[WXConvert NSString:formater[@"formatReplace"]]];
+ }
+ if (formater[@"recoverRule"]) {
+ _recoverRule = [self _preProcessInputTextFormatter:[WXConvert NSString:formater[@"recoverRule"]]];
+ }
+ if (formater[@"recoverReplace"]) {
+ _recoverReplace = [self _preProcessInputTextFormatter:[WXConvert NSString:formater[@"recoverReplace"]]];
+ }
+}
+
+- (NSString*)_preProcessInputTextFormatter:(NSString*)formater
+{
+ NSRange start = [formater rangeOfString:@"/"];
+ NSRange end = [formater rangeOfString:@"/g"];
+ if (start.location == NSNotFound || end.location == NSNotFound || end.location < start.location) {
+ return formater;
+ }
+ NSRange subStringRange = NSMakeRange(start.location+1, end.location - start.location-1);
+
+ return [formater substringWithRange:subStringRange];
+}
#pragma mark - Overwrite Method
-(NSString *)text
@@ -512,6 +549,14 @@ WX_EXPORT_METHOD(@selector(getSelectionRange:))
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
+ if (!string.length) {
+ ((WXTextInputView*)textField).deleteWords = YES;
+ ((WXTextInputView*)textField).editWords = [textField.text substringWithRange:range];
+ } else {
+ ((WXTextInputView*)textField).deleteWords = FALSE;
+ ((WXTextInputView*)textField).editWords = string;
+ }
+
if (_maxLength) {
NSUInteger oldLength = [textField.text length];
NSUInteger replacementLength = [string length];
@@ -521,6 +566,7 @@ WX_EXPORT_METHOD(@selector(getSelectionRange:))
return newLength <= [_maxLength integerValue] ;
}
+
return YES;
}
@@ -551,8 +597,36 @@ WX_EXPORT_METHOD(@selector(getSelectionRange:))
- (void)textFiledEditChanged:(NSNotification *)notifi
{
+ WXTextInputView *textField = (WXTextInputView *)notifi.object;
+ if (_formaterData && _recoverRule && _recoverReplace && _formatRule && _formatReplace) {
+ UITextRange * textRange = textField.selectedTextRange;
+ NSInteger cursorPosition = [textField offsetFromPosition:textField.beginningOfDocument toPosition:textRange.start];
+ NSMutableString * preText = [[textField.text substringToIndex:cursorPosition] mutableCopy];
+ NSMutableString * lastText = [[textField.text substringFromIndex:cursorPosition] mutableCopy];
+
+ NSRegularExpression *recoverRule = [NSRegularExpression regularExpressionWithPattern:_recoverRule options:NSRegularExpressionCaseInsensitive error:NULL];
+ [recoverRule replaceMatchesInString:preText options:0 range:NSMakeRange(0, preText.length) withTemplate:_recoverReplace];
+ [recoverRule replaceMatchesInString:lastText options:0 range:NSMakeRange(0, lastText.length) withTemplate:_recoverReplace];
+ NSMutableString * newString = [NSMutableString stringWithFormat:@"%@%@", preText, lastText];
+ NSRegularExpression *formatRule = [NSRegularExpression regularExpressionWithPattern:_formatRule options:NSRegularExpressionCaseInsensitive error:NULL];
+ [formatRule replaceMatchesInString:newString options:0 range:NSMakeRange(0, newString.length) withTemplate:_formatReplace];
+ NSString * oldText = textField.text;
+ NSInteger adjust = 0;
+
+ if (cursorPosition == textField.text.length) {
+ adjust = newString.length-oldText.length;
+ }
+ if (textField.deleteWords &&[textField.editWords isKindOfClass:[NSString class]] && [_recoverRule isEqualToString:textField.editWords]) {
+ // do nothing
+ } else {
+ textField.text = [newString copy];
+ UITextPosition * newPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorPosition+adjust];
+
+ textField.selectedTextRange = [textField textRangeFromPosition:newPosition toPosition:newPosition];
+ }
+
+ }
if (_inputEvent) {
- UITextField *textField = (UITextField *)notifi.object;
// bind each other , the key must be attrs
[self fireEvent:@"input" params:@{@"value":[textField text]} domChanges:@{@"attrs":@{@"value":[textField text]}}];
}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/460b4272/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.h
index a1b4504..3702aef 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.h
@@ -18,7 +18,15 @@
*/
#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
#import "WXEditComponent.h"
+@interface WXTextInputView : UITextField
+@property (nonatomic, assign) UIEdgeInsets border;
+@property (nonatomic, assign) UIEdgeInsets padding;
+@property (nonatomic, assign) BOOL deleteWords;
+@property (nonatomic, strong) NSString *editWords;
+@end
+
@interface WXTextInputComponent : WXEditComponent
@end
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/460b4272/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
index a9fd3a2..595be8b 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextInputComponent.m
@@ -18,11 +18,7 @@
*/
#import "WXTextInputComponent.h"
-
-@interface WXTextInputView : UITextField
-@property (nonatomic, assign) UIEdgeInsets border;
-@property (nonatomic, assign) UIEdgeInsets padding;
-@end
+#import "WXConvert.h"
@implementation WXTextInputView
@@ -51,6 +47,12 @@
return bounds;
}
+- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
+{
+ // this behavior will hide the action like copy, cut, paste, selectAll and so on.
+ return [[self.wx_component valueForKey:@"allowCopyPaste"] boolValue];
+}
+
- (CGRect)editingRectForBounds:(CGRect)bounds
{
return [self textRectForBounds:bounds];
@@ -60,17 +62,36 @@
@interface WXTextInputComponent()
@property (nonatomic, strong) WXTextInputView *inputView;
+@property (nonatomic, assign) BOOL allowCopyPaste;
@end
@implementation WXTextInputComponent
+- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
+{
+ if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
+ _allowCopyPaste = YES;
+ if (attributes[@"allowCopyPaste"]) {
+ _allowCopyPaste = [WXConvert BOOL:attributes[@"allowCopyPaste"]];
+ }
+ }
+ return self;
+}
+
- (UIView *)loadView
{
_inputView = [[WXTextInputView alloc] init];
return _inputView;
}
+- (void)updateAttributes:(NSDictionary *)attributes {
+ [super updateAttributes:attributes];
+ if (attributes[@"allowCopyPaste"]) {
+ _allowCopyPaste = [WXConvert BOOL:attributes[@"allowCopyPaste"]];
+ }
+}
+
-(void)viewDidLoad
{
[super viewDidLoad];