• 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 }

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

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

  • 相关阅读:
    To select the file to upload we can use the standard HTML input control of type
    Cascading Menu Script using Javascript Explained
    网站首页head区代码规范
    轻松掌握 Java 泛型
    JDK 5.0 中的泛型类型学习
    如何在firefox下获取下列框选中option的text
    是同步方法还是 synchronized 代码? 详解多线程同步规则
    javascript select option对象总结
    Select的动态取值(Text,value),添加,删除。兼容IE,FireFox
    javascript在ie和firefox下的一些差异
  • 原文地址:https://www.cnblogs.com/mzdbskipop/p/3203556.html
Copyright © 2020-2023  润新知