美文网首页iOS开发专题
自定义键盘系列之一怎样自定义输入文本框

自定义键盘系列之一怎样自定义输入文本框

作者: 摸着石头过河_崖边树 | 来源:发表于2017-05-04 22:14 被阅读365次

    前言####

    我们系统可以输入内容的控件有UITextField和UITextView,两者特点有:
    UITextField:可以设置占位文字,但是不能输入多行。
    UITextView:不可以设置占位文字,但是可以输入多行。
    但是往往我们的需求是两者的结合体:设置占位文字,可以输入多行。所以我们需要自定义输入文本框。

    UITextView内部参考结构:

    UITextView内部结构.png

    自定义的输入框效果


    自定义TextView.gif

    怎样自定义输入框####

    1、自定义输入框是继承UITextView的子类(原因:UITextField只能输入单行),但是我们需要加入占位文字功能

    2、自定义的输入文本框需要具有哪些功能?网上虽然有很多自定义控件,但是API完全不够使用,我觉得完整的输入文本框应该具有以下功能:

     /**
    
      * 设置占位文字
      */
    @property (nonatomic, copy) NSString *placeholder;
    /**
     *  设置占位文字颜色
     */
    @property (nonatomic, strong) UIColor *placeholderColor;
    /**
     *  占位文字的X偏移量
     */
    @property (nonatomic, assign) CGFloat placeHolderOffsetX;
    /**
     *  占位文字的Y偏移量
     */
    @property (nonatomic, assign) CGFloat placeHolderOffsetY;
    /**
     *  光标的偏移量
     */
    @property (nonatomic, assign) UIOffset  cursorOffset;
    /**
     *  是否隐藏
     */
    @property (nonatomic, assign)  BOOL placeHolderHidden;
    

    3、具体实现
    3.1 初始化的时候增加占位文字控件,并且增加监听输入文字的通知

     - (instancetype)initWithFrame:(CGRect)frame
    
    {
       if(self = [super initWithFrame:frame])
     {
      [self addSubview:self.placeholderLabel];
      self.alwaysBounceVertical = YES;
      self.font = [UIFont systemFontOfSize:14.0];
      self.placeholderColor = [UIColor grayColor];
      self.placeholderLabel.frame = CGRectMake(5, 10, 0, 0);
      // 监听文字改变
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:nil];
    }
    return self;
    }
    

    3.2 核心代码就是计算占位文字的Size来设置占位Label的frame

      -(void)computePlaceholderLabelSize
    
     {
    CGFloat maxWidth = [UIScreen mainScreen].bounds.size.width - 2 * (self.placeholderLabel.frame.origin.x - self.placeHolderOffsetX);
    CGSize maxSize = CGSizeMake(maxWidth, MAXFLOAT);
    CGSize computeSize = [self.placeholder boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : self.font} context:nil].size; 
    CGRect frame = self.placeholderLabel.frame;
    frame.size = computeSize;
    frame.origin.x = self.placeHolderOffsetX + frame.origin.x;
    frame.origin.y = self.placeHolderOffsetY + frame.origin.y;
    self.placeholderLabel.frame = frame;
     }
    

    3.3 通知监听到输入文字,就会自动隐藏占位Label

     - (void)textDidChange
    
      {
        self.placeHolderHidden = self.hasText;  //这个方法可以实现自定隐藏
      }
    

    注意:有通知,必须要移除通知

      - (void)dealloc
    
    {
         [[NSNotificationCenter defaultCenter] removeObserver:self];
     }
    

    3.4 API接口的实现就不做详细描述,需要查看详细内容,请下载demo

    自定义输入框.png
    本demo的集成只需要两个文件,耦合性低
    详情代码请直接下载demo查看:
    自定义键盘-LZBKeyBoardView

    输入框其他资源:自定义键盘系列之二键盘自适应响应者

    最后赠言###

    star 是对我们程序猿最大的鼓励

    相关文章

      网友评论

        本文标题:自定义键盘系列之一怎样自定义输入文本框

        本文链接:https://www.haomeiwen.com/subject/xmndtxtx.html