add iOS EditBox multiline support

When the inputMode is ANY, then we use TextView to input.
otherwise we use normal UITextField.

Fixed issue https://github.com/cocos2d/cocos2d-x/issues/13436
This commit is contained in:
andyque 2015-09-14 11:07:51 +08:00
parent 4022fb65e1
commit 556175df1e
6 changed files with 613 additions and 121 deletions

View File

@ -378,7 +378,8 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved.
for(UIView* view in subviews) for(UIView* view in subviews)
{ {
if([view isKindOfClass:NSClassFromString(@"CCCustomUITextField")] || if([view isKindOfClass:NSClassFromString(@"CCCustomUITextField")] ||
[view isKindOfClass:NSClassFromString(@"UICustomUITextField")]) [view isKindOfClass:NSClassFromString(@"UISingleLineTextField")] ||
[view isKindOfClass:NSClassFromString(@"UIMultilineTextField")])
{ {
if ([view isFirstResponder]) if ([view isFirstResponder])
{ {

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2012 James Chen Copyright (c) 2012 James Chen
Copyright (c) 2013-2015 zilongshanren
http://www.cocos2d-x.org http://www.cocos2d-x.org

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2012 James Chen Copyright (c) 2012 James Chen
Copyright (c) 2013-2015 zilongshanren
http://www.cocos2d-x.org http://www.cocos2d-x.org

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2012 James Chen Copyright (c) 2012 James Chen
Copyright (c) 2013-2015 zilongshanren
http://www.cocos2d-x.org http://www.cocos2d-x.org

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2012 James Chen Copyright (c) 2012 James Chen
Copyright (c) 2013-2015 zilongshanren
http://www.cocos2d-x.org http://www.cocos2d-x.org
@ -42,12 +43,124 @@ static const int CC_EDIT_BOX_PADDING = 5;
#pragma mark - Internal Classes #pragma mark - Internal Classes
/** TODO: Missing doc - Why is this subclass necessary? /**
* http://stackoverflow.com/questions/1328638/placeholder-in-uitextview
*/ */
@interface UICustomUITextField : UITextField CGFloat const UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION = 0.25;
@interface UIMultilineTextField : UITextView
@property (nonatomic, retain) NSString *placeholder;
@property (nonatomic, retain) UIColor *placeholderColor;
-(void)textChanged:(NSNotification*)notification;
@end @end
@implementation UICustomUITextField @interface UIMultilineTextField ()
@property (nonatomic, retain) UILabel *placeHolderLabel;
@end
@implementation UIMultilineTextField
- (CGRect)textRectForBounds:(CGRect)bounds
{
auto glview = cocos2d::Director::getInstance()->getOpenGLView();
float padding = CC_EDIT_BOX_PADDING * glview->getScaleX() / glview->getContentScaleFactor();
return CGRectInset(bounds, padding, padding);
}
- (id)initWithFrame:(CGRect)frame
{
if( (self = [super initWithFrame:frame]) )
{
[self setPlaceholder:@""];
[self setPlaceholderColor:[UIColor lightGrayColor]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textChanged:)
name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}
- (void)textChanged:(NSNotification *)notification
{
if([[self placeholder] length] == 0)
{
return;
}
[UIView animateWithDuration:UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION animations:^{
if([[self text] length] == 0)
{
[[self viewWithTag:999] setAlpha:1];
}
else
{
[[self viewWithTag:999] setAlpha:0];
}
}];
}
- (void)setText:(NSString *)text {
[super setText:text];
[self textChanged:nil];
}
- (void)drawRect:(CGRect)rect
{
if( [[self placeholder] length] > 0 )
{
if (_placeHolderLabel == nil )
{
_placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
_placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
_placeHolderLabel.numberOfLines = 0;
_placeHolderLabel.font = self.font;
_placeHolderLabel.backgroundColor = [UIColor clearColor];
_placeHolderLabel.textColor = self.placeholderColor;
_placeHolderLabel.alpha = 0;
_placeHolderLabel.tag = 999;
[self addSubview:_placeHolderLabel];
}
_placeHolderLabel.text = self.placeholder;
[_placeHolderLabel sizeToFit];
[self sendSubviewToBack:_placeHolderLabel];
}
if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
{
[[self viewWithTag:999] setAlpha:1];
}
[super drawRect:rect];
}
- (CGRect)editingRectForBounds:(CGRect)bounds
{
return [self textRectForBounds:bounds];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_placeHolderLabel release];
_placeHolderLabel = nil;
[_placeholderColor release];
_placeholderColor = nil;
[_placeholder release];
_placeholder = nil;
[super dealloc];
}
@end
/** TODO: Missing doc - Why is this subclass necessary?
*/
@interface UISingleLineTextField : UITextField
@end
@implementation UISingleLineTextField
- (CGRect)textRectForBounds:(CGRect)bounds - (CGRect)textRectForBounds:(CGRect)bounds
{ {
@ -67,10 +180,14 @@ static const int CC_EDIT_BOX_PADDING = 5;
#pragma mark - UIEditBox ios implementation #pragma mark - UIEditBox ios implementation
@interface UIEditBoxImplIOS_objc : NSObject <UITextFieldDelegate> @interface UIEditBoxImplIOS_objc : NSObject <UITextFieldDelegate, UITextViewDelegate>
@property (nonatomic, retain) UITextField *textField; @property (nonatomic, retain) UITextField *textField;
@property (nonatomic, retain) UITextView *textView;
@property (nonatomic, assign) void *editBox; @property (nonatomic, assign) void *editBox;
@property (nonatomic, assign) CGRect frameRect;
@property (nonatomic, assign) cocos2d::ui::EditBox::InputFlag dataInputMode;
@property (nonatomic, assign) cocos2d::ui::EditBox::KeyboardReturnType keyboardReturnType;
@property (nonatomic, readonly, getter = isEditState) BOOL editState; @property (nonatomic, readonly, getter = isEditState) BOOL editState;
- (instancetype)initWithFrame:(CGRect)frameRect editBox:(void *)editBox; - (instancetype)initWithFrame:(CGRect)frameRect editBox:(void *)editBox;
@ -97,39 +214,349 @@ static const int CC_EDIT_BOX_PADDING = 5;
if (self) if (self)
{ {
_editState = NO; _editState = NO;
UITextField *textField = [[[UICustomUITextField alloc] initWithFrame: frameRect] autorelease]; self.textField = nil;
self.textView = nil;
self.frameRect = frameRect;
self.editBox = editBox;
self.dataInputMode = cocos2d::ui::EditBox::InputFlag::INTIAL_CAPS_ALL_CHARACTERS;
self.keyboardReturnType = cocos2d::ui::EditBox::KeyboardReturnType::DEFAULT;
[self createMultiLineTextField];
}
textField.textColor = [UIColor whiteColor]; return self;
}
- (void)createSingleLineTextField{
UISingleLineTextField *textField = [[[UISingleLineTextField alloc] initWithFrame: self.frameRect] autorelease];
UIColor *textColor;
NSString *text;
NSString *placeholder;
CGFloat fontSize;
if (self.textView != nil) {
textColor = self.textView.textColor;
text = self.textView.text;
placeholder = [(UIMultilineTextField*)self.textView placeholder];
fontSize = [self.textView.font pointSize];
}
else{
textColor = [UIColor whiteColor];
text = @"";
placeholder = @"";
fontSize = self.frameRect.size.height*2/3;
}
textField.textColor = textColor;
// TODO: need to delete hard code here. // TODO: need to delete hard code here.
textField.font = [UIFont systemFontOfSize:frameRect.size.height*2/3]; textField.font = [UIFont systemFontOfSize: fontSize];
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.backgroundColor = [UIColor clearColor]; textField.backgroundColor = [UIColor clearColor];
textField.borderStyle = UITextBorderStyleNone; textField.borderStyle = UITextBorderStyleNone;
textField.delegate = self; textField.delegate = self;
textField.hidden = true; textField.hidden = true;
textField.returnKeyType = UIReturnKeyDefault; textField.returnKeyType = UIReturnKeyDefault;
textField.text = text;
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged]; [textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
self.textField = textField; self.textField = textField;
self.editBox = editBox;
[self removeMultiLineTextField];
} }
return self; - (void)createMultiLineTextField{
UIMultilineTextField *textView = [[[UIMultilineTextField alloc] initWithFrame: self.frameRect] autorelease];
UIColor *textColor;
NSString *text;
NSString *placeholder;
CGFloat fontSize;
if (self.textField != nil) {
textColor = self.textField.textColor;
text = self.textField.text;
placeholder = [self.textField placeholder];
fontSize = [self.textField.font pointSize];
}
else{
textColor = [UIColor whiteColor];
text = @"";
placeholder = @"";
fontSize = self.frameRect.size.height*2/3;
}
textView.textColor = textColor;
textView.font = [UIFont systemFontOfSize:fontSize];
textView.backgroundColor = [UIColor clearColor];
textView.delegate = self;
textView.hidden = true;
textView.returnKeyType = UIReturnKeyDefault;
textView.text = text;
textView.placeholder = placeholder;
self.textView = textView;
[self removeSingleLineTextField];
}
-(void)removeSingleLineTextField{
if (_textField != nil)
{
[_textField resignFirstResponder];
[_textField removeFromSuperview];
self.textField = nil;
}
}
-(void)removeMultiLineTextField{
if (_textView != nil)
{
[_textView resignFirstResponder];
[_textView removeFromSuperview];
self.textView = nil;
}
} }
- (void)dealloc - (void)dealloc
{ {
[_textField resignFirstResponder]; [self removeSingleLineTextField];
[_textField removeFromSuperview]; [self removeMultiLineTextField];
self.textField = nil;
[super dealloc]; [super dealloc];
} }
#pragma mark - Public methods #pragma mark - Public methods
- (void)setFont:(UIFont*)font{
if (_textField != nil)
{
[_textField setFont:font];
}
if (_textView != nil) {
[_textView setFont:font];
}
}
- (void)setTextColor:(UIColor*)color{
if (_textField != nil)
{
[_textField setTextColor:color];
}
if (_textView != nil) {
[_textView setTextColor:color];
}
}
- (void)setInputMode:(cocos2d::ui::EditBox::InputMode)inputMode{
//multiline input
if (inputMode == cocos2d::ui::EditBox::InputMode::ANY)
{
if (self.textField != nil)
{
[self createMultiLineTextField];
[self setInputFlag:self.dataInputMode];
[self setReturnType:self.keyboardReturnType];
}
}
else
{
if (self.textView != nil) {
[self createSingleLineTextField];
[self setInputFlag:self.dataInputMode];
[self setReturnType:self.keyboardReturnType];
}
}
switch (inputMode)
{
case cocos2d::ui::EditBox::InputMode::EMAIL_ADDRESS:
self.keyboardType = UIKeyboardTypeEmailAddress;
break;
case cocos2d::ui::EditBox::InputMode::NUMERIC:
self.keyboardType = UIKeyboardTypeDecimalPad;
break;
case cocos2d::ui::EditBox::InputMode::PHONE_NUMBER:
self.keyboardType = UIKeyboardTypePhonePad;
break;
case cocos2d::ui::EditBox::InputMode::URL:
self.keyboardType = UIKeyboardTypeURL;
break;
case cocos2d::ui::EditBox::InputMode::DECIMAL:
self.keyboardType = UIKeyboardTypeDecimalPad;
break;
case cocos2d::ui::EditBox::InputMode::SINGLE_LINE:
self.keyboardType = UIKeyboardTypeDefault;
break;
default:
self.keyboardType = UIKeyboardTypeDefault;
break;
}
}
- (void)setKeyboardType:(UIKeyboardType)type{
if (_textField != nil)
{
[_textField setKeyboardType:type];
}
if (_textView != nil) {
[_textView setKeyboardType:type];
}
}
- (void)setInputFlag:(cocos2d::ui::EditBox::InputFlag)flag{
self.dataInputMode = flag;
switch (flag)
{
case cocos2d::ui::EditBox::InputFlag::PASSWORD:
if (self.textField != nil)
{
self.textField.secureTextEntry = YES;
}
//textView can't be used for input password
break;
case cocos2d::ui::EditBox::InputFlag::INITIAL_CAPS_WORD:
if (self.textField != nil)
{
self.textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
}
if (self.textView != nil)
{
self.textView.autocapitalizationType = UITextAutocapitalizationTypeWords;
}
break;
case cocos2d::ui::EditBox::InputFlag::INITIAL_CAPS_SENTENCE:
if (self.textField != nil)
{
self.textField.autocapitalizationType = UITextAutocapitalizationTypeSentences;
}
if (self.textView != nil)
{
self.textView.autocapitalizationType = UITextAutocapitalizationTypeSentences;
}
break;
case cocos2d::ui::EditBox::InputFlag::INTIAL_CAPS_ALL_CHARACTERS:
if (self.textField != nil)
{
self.textField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
}
if (self.textView != nil)
{
self.textView.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
}
break;
case cocos2d::ui::EditBox::InputFlag::SENSITIVE:
if (self.textField != nil)
{
self.textField.autocorrectionType = UITextAutocorrectionTypeNo;
}
if (self.textView != nil)
{
self.textView.autocorrectionType = UITextAutocorrectionTypeNo;
}
break;
default:
break;
}
}
- (void)setReturnType:(cocos2d::ui::EditBox::KeyboardReturnType)returnType{
self.keyboardReturnType = returnType;
switch (returnType) {
case cocos2d::ui::EditBox::KeyboardReturnType::DEFAULT:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeyDefault;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeyDefault;
}
break;
case cocos2d::ui::EditBox::KeyboardReturnType::DONE:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeyDone;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeyDone;
}
break;
case cocos2d::ui::EditBox::KeyboardReturnType::SEND:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeySend;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeySend;
}
break;
case cocos2d::ui::EditBox::KeyboardReturnType::SEARCH:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeySearch;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeySearch;
}
break;
case cocos2d::ui::EditBox::KeyboardReturnType::GO:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeyGo;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeyGo;
}
break;
default:
if (self.textField != nil) {
self.textField.returnKeyType = UIReturnKeyDefault;
}
if (self.textView != nil) {
self.textView.returnKeyType = UIReturnKeyDefault;
}
break;
}
}
- (void)setText:(NSString*)text{
if (self.textField != nil) {
self.textField.text = text;
}
if (self.textView != nil) {
self.textView.text = text;
}
}
- (NSString*)getText{
if (self.textField != nil) {
return self.textField.text;
}
if (self.textView != nil) {
return self.textView.text;
}
return @"";
}
- (void)setVisible:(BOOL)visible{
if (self.textField != nil) {
self.textField.hidden = !visible;
}
if (self.textView != nil) {
self.textView.hidden = !visible;
}
}
- (NSString*)getDefaultFontName{
if (self.textField != nil) {
return [self.textField.font fontName];
}
if (self.textView != nil) {
return [self.textView.font fontName];
}
return @"";
}
- (void)setPlaceHolder:(NSString*)text{
if (self.textField != nil) {
self.textField.placeholder = text;
}
if (self.textView != nil) {
[(UIMultilineTextField*)self.textView setPlaceholder:text];
}
}
- (void)doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance - (void)doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance
{ {
@ -142,34 +569,66 @@ static const int CC_EDIT_BOX_PADDING = 5;
- (void)setPosition:(CGPoint)pos - (void)setPosition:(CGPoint)pos
{ {
// TODO: Handle anchor point? // TODO: Handle anchor point?
if (_textField != nil)
{
CGRect frame = _textField.frame; CGRect frame = _textField.frame;
frame.origin = pos; frame.origin = pos;
_textField.frame = frame; _textField.frame = frame;
} }
if (_textView != nil)
{
CGRect frame = _textView.frame;
frame.origin = pos;
_textView.frame = frame;
}
}
- (void)setContentSize:(CGSize)size - (void)setContentSize:(CGSize)size
{
if (_textField != nil)
{ {
CGRect frame = _textField.frame; CGRect frame = _textField.frame;
frame.size = size; frame.size = size;
_textField.frame = frame; _textField.frame = frame;
} }
if (_textView != nil)
{
CGRect frame = _textView.frame;
frame.size = size;
_textView.frame = frame;
}
}
- (void)openKeyboard - (void)openKeyboard
{ {
auto view = cocos2d::Director::getInstance()->getOpenGLView(); auto view = cocos2d::Director::getInstance()->getOpenGLView();
CCEAGLView *eaglview = (CCEAGLView *)view->getEAGLView(); CCEAGLView *eaglview = (CCEAGLView *)view->getEAGLView();
if (_textField != nil)
{
[eaglview addSubview:_textField]; [eaglview addSubview:_textField];
[_textField becomeFirstResponder]; [_textField becomeFirstResponder];
} }
if (_textView != nil)
{
[eaglview addSubview:_textView];
[_textView becomeFirstResponder];
}
}
- (void)closeKeyboard - (void)closeKeyboard
{
if (_textField != nil)
{ {
[_textField resignFirstResponder]; [_textField resignFirstResponder];
[_textField removeFromSuperview]; [_textField removeFromSuperview];
} }
if (_textView != nil)
{
[_textView resignFirstResponder];
[_textView removeFromSuperview];
}
}
- (BOOL)textFieldShouldReturn:(UITextField *)sender - (BOOL)textFieldShouldReturn:(UITextField *)sender
{ {
@ -187,6 +646,72 @@ static const int CC_EDIT_BOX_PADDING = 5;
[eaglview doAnimationWhenAnotherEditBeClicked]; [eaglview doAnimationWhenAnotherEditBeClicked];
} }
#pragma mark - UITextView delegate methods
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
CCLOG("textFieldShouldBeginEditing...");
_editState = YES;
auto view = cocos2d::Director::getInstance()->getOpenGLView();
CCEAGLView *eaglview = (CCEAGLView *) view->getEAGLView();
if ([eaglview isKeyboardShown])
{
[self performSelector:@selector(animationSelector) withObject:nil afterDelay:0.0f];
}
getEditBoxImplIOS()->editBoxEditingDidBegin();
return YES;
}
- (BOOL)textViewShouldEndEditing:(UITextView *)textView;
{
CCLOG("textFieldShouldEndEditing...");
_editState = NO;
getEditBoxImplIOS()->refreshInactiveText();
const char* inputText = [textView.text UTF8String];
getEditBoxImplIOS()->editBoxEditingDidEnd(inputText);
return YES;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
int maxLength = getEditBoxImplIOS()->getMaxLength();
if (maxLength < 0)
{
return YES;
}
// Prevent crashing undo bug http://stackoverflow.com/questions/433337/set-the-maximum-character-length-of-a-uitextfield
if(range.length + range.location > textView.text.length)
{
return NO;
}
NSUInteger oldLength = textView.text.length;
NSUInteger replacementLength = text.length;
NSUInteger rangeLength = range.length;
NSUInteger newLength = oldLength - rangeLength + replacementLength;
return newLength <= maxLength;
}
- (void)textViewDidChange:(UITextView *)textView
{
int maxLength = getEditBoxImplIOS()->getMaxLength();
if (textView.text.length > maxLength) {
textView.text = [textView.text substringToIndex:maxLength];
}
const char* inputText = [textView.text UTF8String];
getEditBoxImplIOS()->editBoxEditingChanged(inputText);
}
#pragma mark - UITextField delegate methods
/** /**
* Called each time when the text field's text has changed. * Called each time when the text field's text has changed.
*/ */
@ -201,8 +726,6 @@ static const int CC_EDIT_BOX_PADDING = 5;
getEditBoxImplIOS()->editBoxEditingChanged(inputText); getEditBoxImplIOS()->editBoxEditingChanged(inputText);
} }
#pragma mark - UITextField delegate methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)sender // return NO to disallow editing. - (BOOL)textFieldShouldBeginEditing:(UITextField *)sender // return NO to disallow editing.
{ {
CCLOG("textFieldShouldBeginEditing..."); CCLOG("textFieldShouldBeginEditing...");
@ -323,13 +846,13 @@ void EditBoxImplIOS::setNativeFont(const char* pFontName, int fontSize)
{ {
UIFont* textFont = constructFont(pFontName, fontSize); UIFont* textFont = constructFont(pFontName, fontSize);
if(textFont != nil) { if(textFont != nil) {
[_systemControl.textField setFont:textFont]; [_systemControl setFont:textFont];
} }
} }
void EditBoxImplIOS::setNativeFontColor(const Color4B& color) void EditBoxImplIOS::setNativeFontColor(const Color4B& color)
{ {
_systemControl.textField.textColor = [UIColor colorWithRed:color.r / 255.0f _systemControl.textColor = [UIColor colorWithRed:color.r / 255.0f
green:color.g / 255.0f green:color.g / 255.0f
blue:color.b / 255.0f blue:color.b / 255.0f
alpha:color.a / 255.f]; alpha:color.a / 255.f];
@ -348,54 +871,12 @@ void EditBoxImplIOS::setNativePlaceholderFontColor(const Color4B& color)
void EditBoxImplIOS::setNativeInputMode(EditBox::InputMode inputMode) void EditBoxImplIOS::setNativeInputMode(EditBox::InputMode inputMode)
{ {
switch (inputMode) [_systemControl setInputMode:inputMode];
{
case EditBox::InputMode::EMAIL_ADDRESS:
_systemControl.textField.keyboardType = UIKeyboardTypeEmailAddress;
break;
case EditBox::InputMode::NUMERIC:
_systemControl.textField.keyboardType = UIKeyboardTypeDecimalPad;
break;
case EditBox::InputMode::PHONE_NUMBER:
_systemControl.textField.keyboardType = UIKeyboardTypePhonePad;
break;
case EditBox::InputMode::URL:
_systemControl.textField.keyboardType = UIKeyboardTypeURL;
break;
case EditBox::InputMode::DECIMAL:
_systemControl.textField.keyboardType = UIKeyboardTypeDecimalPad;
break;
case EditBox::InputMode::SINGLE_LINE:
_systemControl.textField.keyboardType = UIKeyboardTypeDefault;
break;
default:
_systemControl.textField.keyboardType = UIKeyboardTypeDefault;
break;
}
} }
void EditBoxImplIOS::setNativeInputFlag(EditBox::InputFlag inputFlag) void EditBoxImplIOS::setNativeInputFlag(EditBox::InputFlag inputFlag)
{ {
switch (inputFlag) [_systemControl setInputFlag:inputFlag];
{
case EditBox::InputFlag::PASSWORD:
_systemControl.textField.secureTextEntry = YES;
break;
case EditBox::InputFlag::INITIAL_CAPS_WORD:
_systemControl.textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
break;
case EditBox::InputFlag::INITIAL_CAPS_SENTENCE:
_systemControl.textField.autocapitalizationType = UITextAutocapitalizationTypeSentences;
break;
case EditBox::InputFlag::INTIAL_CAPS_ALL_CHARACTERS:
_systemControl.textField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
break;
case EditBox::InputFlag::SENSITIVE:
_systemControl.textField.autocorrectionType = UITextAutocorrectionTypeNo;
break;
default:
break;
}
} }
NSString* removeSiriString(NSString* str) NSString* removeSiriString(NSString* str)
@ -406,51 +887,32 @@ NSString* removeSiriString(NSString* str)
const char* EditBoxImplIOS::getText(void) const char* EditBoxImplIOS::getText(void)
{ {
return [removeSiriString(_systemControl.textField.text) UTF8String]; return [removeSiriString([_systemControl getText]) UTF8String];
} }
void EditBoxImplIOS::setNativeReturnType(EditBox::KeyboardReturnType returnType) void EditBoxImplIOS::setNativeReturnType(EditBox::KeyboardReturnType returnType)
{ {
switch (returnType) { [_systemControl setReturnType:returnType];
case EditBox::KeyboardReturnType::DEFAULT:
_systemControl.textField.returnKeyType = UIReturnKeyDefault;
break;
case EditBox::KeyboardReturnType::DONE:
_systemControl.textField.returnKeyType = UIReturnKeyDone;
break;
case EditBox::KeyboardReturnType::SEND:
_systemControl.textField.returnKeyType = UIReturnKeySend;
break;
case EditBox::KeyboardReturnType::SEARCH:
_systemControl.textField.returnKeyType = UIReturnKeySearch;
break;
case EditBox::KeyboardReturnType::GO:
_systemControl.textField.returnKeyType = UIReturnKeyGo;
break;
default:
_systemControl.textField.returnKeyType = UIReturnKeyDefault;
break;
}
} }
void EditBoxImplIOS::setNativeText(const char* pText) void EditBoxImplIOS::setNativeText(const char* pText)
{ {
NSString* nsText =[NSString stringWithUTF8String:pText]; NSString* nsText =[NSString stringWithUTF8String:pText];
if ([nsText compare:_systemControl.textField.text] != NSOrderedSame) if ([nsText compare: [_systemControl getText]] != NSOrderedSame)
{ {
_systemControl.textField.text = nsText; _systemControl.text = nsText;
} }
} }
void EditBoxImplIOS::setNativePlaceHolder(const char* pText) void EditBoxImplIOS::setNativePlaceHolder(const char* pText)
{ {
_systemControl.textField.placeholder = [NSString stringWithUTF8String:pText]; [_systemControl setPlaceHolder:[NSString stringWithUTF8String:pText]];
} }
void EditBoxImplIOS::setNativeVisible(bool visible) void EditBoxImplIOS::setNativeVisible(bool visible)
{ {
_systemControl.textField.hidden = !visible; [_systemControl setVisible:visible];
} }
void EditBoxImplIOS::updateNativeFrame(const Rect& rect) void EditBoxImplIOS::updateNativeFrame(const Rect& rect)
@ -470,13 +932,13 @@ void EditBoxImplIOS::setNativeContentSize(const Size& size)
const char* EditBoxImplIOS::getNativeDefaultFontName() const char* EditBoxImplIOS::getNativeDefaultFontName()
{ {
const char* pDefaultFontName = [[_systemControl.textField.font fontName] UTF8String]; const char* pDefaultFontName = [[_systemControl getDefaultFontName] UTF8String];
return pDefaultFontName; return pDefaultFontName;
} }
void EditBoxImplIOS::nativeOpenKeyboard() void EditBoxImplIOS::nativeOpenKeyboard()
{ {
_systemControl.textField.hidden = NO; [_systemControl setVisible:YES];
[_systemControl openKeyboard]; [_systemControl openKeyboard];
} }
@ -497,7 +959,7 @@ UIFont* EditBoxImplIOS::constructFont(const char *fontName, int fontSize)
if (fontSize == -1) if (fontSize == -1)
{ {
fontSize = [_systemControl.textField frame].size.height*2/3; fontSize = _systemControl.frameRect.size.height*2/3;
} }
else else
{ {

View File

@ -57,8 +57,8 @@ bool UIEditBoxTest::init()
// top // top
std::string pNormalSprite = "extensions/green_edit.png"; std::string pNormalSprite = "extensions/green_edit.png";
_editName = ui::EditBox::create(editBoxSize, ui::Scale9Sprite::create(pNormalSprite)); _editName = ui::EditBox::create(editBoxSize + Size(0,40), ui::Scale9Sprite::create(pNormalSprite));
_editName->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height*3/4)); _editName->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2-50, visibleOrigin.y+visibleSize.height*3/4));
_editName->setFontColor(Color3B::RED); _editName->setFontColor(Color3B::RED);
_editName->setPlaceHolder("Name:"); _editName->setPlaceHolder("Name:");
_editName->setPlaceholderFontColor(Color3B::WHITE); _editName->setPlaceholderFontColor(Color3B::WHITE);
@ -69,9 +69,19 @@ bool UIEditBoxTest::init()
_editName->setDelegate(this); _editName->setDelegate(this);
addChild(_editName); addChild(_editName);
Button* button = Button::create("cocosui/animationbuttonnormal.png",
"cocosui/animationbuttonpressed.png");
auto buttonSize = button->getContentSize();
button->setTitleText("Single Line");
button->setPosition(_editName->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 ));
button->addClickEventListener([=](Ref* ref){
_editName->setInputMode(ui::EditBox::InputMode::SINGLE_LINE);
});
addChild(button);
// middle // middle
_editPassword = ui::EditBox::create(editBoxSize, "extensions/orange_edit.png"); _editPassword = ui::EditBox::create(editBoxSize, "extensions/orange_edit.png");
_editPassword->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height/2)); _editPassword->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2-50, visibleOrigin.y+visibleSize.height/2));
_editPassword->setFontColor(Color3B::GREEN); _editPassword->setFontColor(Color3B::GREEN);
_editPassword->setPlaceHolder("Password:"); _editPassword->setPlaceHolder("Password:");
_editPassword->setMaxLength(6); _editPassword->setMaxLength(6);
@ -81,15 +91,31 @@ bool UIEditBoxTest::init()
_editPassword->setDelegate(this); _editPassword->setDelegate(this);
addChild(_editPassword); addChild(_editPassword);
auto buttonPassword = (ui::Button*)button->clone();
buttonPassword->setTitleText("Multiline");
buttonPassword->setPosition(_editPassword->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 ));
buttonPassword->addClickEventListener([=](Ref* ref){
_editPassword->setInputMode(ui::EditBox::InputMode::ANY);
});
addChild(buttonPassword);
// bottom // bottom
auto bottomButtonSize = Size(editBoxSize.width, editBoxSize.height + 10); auto bottomButtonSize = Size(editBoxSize.width, editBoxSize.height + 10);
_editEmail = ui::EditBox::create(bottomButtonSize, "extensions/yellow_edit.png"); _editEmail = ui::EditBox::create(bottomButtonSize, "extensions/yellow_edit.png");
_editEmail->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2, visibleOrigin.y+visibleSize.height/4)); _editEmail->setPosition(Vec2(visibleOrigin.x+visibleSize.width/2-50, visibleOrigin.y+visibleSize.height/4));
_editEmail->setPlaceHolder("Email:"); _editEmail->setPlaceHolder("Email:");
_editEmail->setInputMode(ui::EditBox::InputMode::EMAIL_ADDRESS); _editEmail->setInputMode(ui::EditBox::InputMode::EMAIL_ADDRESS);
_editEmail->setDelegate(this); _editEmail->setDelegate(this);
addChild(_editEmail); addChild(_editEmail);
auto buttonEmail = (ui::Button*)button->clone();
buttonEmail->setTitleText("Multiline");
buttonEmail->setPosition(_editEmail->getPosition() + Vec2(editBoxSize.width/2 + buttonSize.width/2, 0 ));
buttonEmail->addClickEventListener([=](Ref* ref){
_editEmail->setInputMode(ui::EditBox::InputMode::ANY);
});
addChild(buttonEmail);
return true; return true;
} }
return false; return false;