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 }

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

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

 

你可能感兴趣的:(input)