zoukankan      html  css  js  c++  java
  • 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 }

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

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

  • 相关阅读:
    redis五中数据类型
    MySQL索引
    mysql中如何设计计数器表(待续)
    mysql 数据类型选择原则
    1.开篇(听说你还在艰难的啃react源码)
    关于wamp的HTML, PHP, mysql 三者的操作与联系
    关于wamp的HTML, PHP, mysql 三者的操作与联系
    关于wamp的HTML, PHP, mysql 三者的操作与联系
    SQL server T-sql语句查询执行顺序
    SQL server T-SQL索引详解
  • 原文地址:https://www.cnblogs.com/mzdbskipop/p/3203556.html
Copyright © 2011-2022 走看看