有时候由于特殊原因,不想去用ios系统的默认输入控件如UITextView等,此时则需要自己定制文本控件。
下面步骤最后形成的控件,仅支持英文字符输入,其余功能比如插入符闪烁,文本选择等等都不具备!
1.首先,要新建一个继承UIView的类。并声明如下几个类型的属性,用来记录一个文本控件内容:
1 @interface SIPTextView : UIView<UIKeyInput> 2 { 3 NSMutableString *textStore; 4 UIFont *font; 5 UIColor *textColor; 6 } 7 @property (nonatomic, retain) NSMutableString *textStore; 8 @property (nonatomic, retain) UIColor *textColor; 9 @property (nonatomic, retain) UIFont *font;
在init方法中可以初始化这些数据:
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor whiteColor]; self.textColor = [UIColor blackColor]; self.font = [UIFont boldSystemFontOfSize:12.0f]; self.textStore = [NSMutableString string]; } return self; }
2.接着让这个类实现协议UIKeyInput,协议声明详情如下:
@protocol UIKeyInput <UITextInputTraits> - (BOOL)hasText; - (void)insertText:(NSString *)text; - (void)deleteBackward; @end
协议中insertText方法会在用户在此控件有键盘输入时被调用,我们要在此记录输入的文本信息。deleteBackward方法会在用户想按键删除一个输入字符时被调用,我们要在此删除一个字符:
#pragma mark UIKeyInput protocol -(void)insertText:(NSString *)text { [textStore appendString:text]; //呼唤重绘 [self setNeedsDisplay]; } - (BOOL)hasText { return textStore.length > 0; } - (void)deleteBackward { if ([textStore length] == 0) { return; } NSRange theRange = NSMakeRange(textStore.length - 1, 1); [textStore deleteCharactersInRange:theRange]; //呼唤重绘 [self setNeedsDisplay]; }
由于默认情况下控件无法成为第一响应者,所以必须更改此设置,并让其在被点击时成为第一响应者:
1 - (BOOL)canBecomeFirstResponder { 2 return YES; 3 } 4 5 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 6 if (![self isFirstResponder]) { 7 [self becomeFirstResponder]; 8 } 9 }
目前为止,此视图已经可以正常接收键盘输入消息了(可在insertText方法log出来看)。
3.最后一步是把存储了键盘输入信息的文本属性显示出来,重写视图的drawRect方法如下:
1 - (CGRect)rectForTextWithInset:(CGFloat)inset { 2 return CGRectInset(self.bounds, inset, inset); 3 } 4 5 - (void)drawRect:(CGRect)rect { 6 CGRect rectForText = [self rectForTextWithInset:8.0f]; 7 //设置当前绘制颜色 8 [textColor set]; 9 //绘制矩形框边缘,UIRectFill(rect)则绘制矩形内部 10 //UIRectFrame(rect); 11 //一般用NSString的内置draw方法绘制文字 12 [textStore drawInRect:rectForText withFont:font]; 13 }
以上就是定制简易文本控件所有步骤。
------------------------------------------------------------------------------------------------------------------------------------------------------
由于UIKeyInput协议遵循UITextInputTraits协议(此协议可以自行查阅其相关方法),因此也可以为这个视图设置键盘风格等,比如可以设置键盘类型为数字键盘:
1 - (UIKeyboardType)keyboardType { 2 return UIKeyboardTypeNumberPad; 3 }
------------------------------------------------------------------------------------------------------------------------------------------------------
要实现支持中文输入,闪烁光标和选区功能的文本控件比较复杂,下次再写吧......