iOS 简易文本控件开发(UIKeyInput协议学习)

有时候由于特殊原因,不想去用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 }

------------------------------------------------------------------------------------------------------------------------------------------------------

要实现支持中文输入,闪烁光标和选区功能的文本控件比较复杂,下次再写吧......

 

posted @ 2013-08-24 11:04  skipop  阅读(5183)  评论(4编辑  收藏  举报