iOS-UITextView的placeholder以及字数控制

我们都知道UITextView控件不像UITextField一样有一个placeholder属性来设置文本输入框的灰色提示文本,这个时候我们可以自己来实现,效果图如下:

代码如下:

static const int LimitMaxWord = 100;

@interface AddRemarkView ()<UITextViewDelegate>

/// 备注输入框
@property (nonatomic, weak) UITextView *txvRemark;
/// 备注placholder
@property (nonatomic, weak) UILabel *lblPlaceHolder;
/// 备注字数限制
@property (nonatomic, weak) UILabel *lblCount;

@end

@implementation AddRemarkView

- (instancetype)init {
    if (self == [super init]) {
        [self setSubView];
    }
    return self;
}

- (void) setSubView {
    self.backgroundColor = DefaultGrayCOLOR;

    /// 备注输入框
    UITextView *txvRemark = [[UITextView alloc]init];
    self.txvRemark = txvRemark;
    txvRemark.returnKeyType = UIReturnKeyDone;
    /// textview内
    txvRemark.textContainerInset = UIEdgeInsetsMake(12, 12, 25, 16);
    txvRemark.delegate = self;
    txvRemark.backgroundColor = [UIColor whiteColor];
    txvRemark.textColor = TextBlackCOLOR;
    txvRemark.font = SET_FONT(15);
    [self addSubview:txvRemark];
    [txvRemark mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(4);
        make.height.mas_equalTo(150);
    }];
    
    /// 备注placholder
    UILabel *lblPlaceHolder = [[UILabel alloc]init];
    self.lblPlaceHolder = lblPlaceHolder;
    lblPlaceHolder.text = BZLocalizedString(@"customer_remark_plachoder", nil);
    lblPlaceHolder.textColor = TextLightGrayCOLOR;
    lblPlaceHolder.font = SET_FONT(15);
    [self addSubview:lblPlaceHolder];
    [lblPlaceHolder mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(16);
        make.right.mas_equalTo(-16);
        make.top.equalTo(txvRemark.mas_top).offset(12);
        make.height.mas_equalTo(20);
    }];
    
    /// 备注字数限制(UITextView上添加不了view???)
    UILabel *lblCount = [[UILabel alloc]init];
    self.lblCount = lblCount;
    lblCount.textAlignment = NSTextAlignmentRight;
    lblCount.text = @"0/100";
    lblCount.textColor = TextLightGrayCOLOR;
    lblCount.font = SET_FONT(12);
    [self addSubview:lblCount];
    [lblCount mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(txvRemark.mas_right).offset(-16);
        make.width.mas_equalTo(60);
        make.bottom.equalTo(txvRemark.mas_bottom).offset(-5);
        make.height.mas_equalTo(20);
    }];
    
    /// 保存
    UIButton *btnSave = [UIButton buttonWithType:UIButtonTypeCustom];
    btnSave.backgroundColor = MainThemeColor;
    btnSave.layer.masksToBounds = YES;
    btnSave.layer.cornerRadius = 2.0;
    [btnSave setTitle:BZLocalizedString(@"common_save", nil) forState:UIControlStateNormal];
    [btnSave setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    btnSave.titleLabel.font = SET_FONT(15);
    [self addSubview:btnSave];
    [btnSave mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(16);
        make.right.mas_equalTo(-16);
        make.top.equalTo(txvRemark.mas_bottom).offset(50);
        make.height.mas_equalTo(@48);
    }];
    [btnSave addTarget:self
                action:@selector(saveAction)
      forControlEvents:UIControlEventTouchUpInside];
}

#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView {
    self.lblPlaceHolder.hidden = YES;
    
    if (textView.text.length > LimitMaxWord) {
        textView.text = [textView.text substringToIndex:LimitMaxWord];
    }
    /// 取消按钮点击权限,并显示提示文字
    if (textView.text.length == 0) {
        self.lblPlaceHolder.hidden = NO;
    }
    
    /// 记录输入的字数,你若不统计字数,忽略这行
    self.lblCount.text = [NSString stringWithFormat:@"%lu/%d", (unsigned long)[textView.text length], LimitMaxWord];
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]) {
        /// 判断输入的字是否是回车,即按下return
        /// 在这里做你响应return键的代码
        [textView resignFirstResponder];
        /// 这里返回NO,就代表return键值失效,即页面上按下return,不会出现换行,如果为yes,则输入页面会换行
        return NO;
    }
    NSString *str = [NSString stringWithFormat:@"%@%@", textView.text, text];
    if (str.length > LimitMaxWord){
        NSRange rangeIndex = [str rangeOfComposedCharacterSequenceAtIndex:LimitMaxWord];
        
        /// 字数超限
        if (rangeIndex.length == 1) {
            textView.text = [str substringToIndex:LimitMaxWord];
            /// 这里重新统计下字数,字数超限,我发现就不走textViewDidChange方法了,你若不统计字数,忽略这行
            self.lblCount.text = [NSString stringWithFormat:@"%lu/%d", (unsigned long)textView.text.length, LimitMaxWord];
        }else{
            NSRange rangeRange = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, LimitMaxWord)];
            textView.text = [str substringWithRange:rangeRange];
        }
        return NO;
    }
    return YES;
}

#pragma mark - Action
- (void)saveAction {
    /// "customer_remark_plachoder" = "请输入备注信息,最多可输入100字。";
    /// "customer_remark_plachoderalert" = "请输入备注信息";
    [self.txvRemark resignFirstResponder];
    if(![self.txvRemark.text isEqualToString:BZLocalizedString(@"customer_remark_plachoder", nil)] &&
       self.txvRemark.text.length != 0){
        if ([self.delegate respondsToSelector:@selector(addRemarkWithAddRemarkView:withRemarkStr:)]) {
            [self.delegate addRemarkWithAddRemarkView:self
                                        withRemarkStr:self.txvRemark.text];
        }
    }else{
        [BZAlertView showAlterWillDismiss:BZLocalizedString(@"customer_remark_plachoderalert", nil)];
    }
}

@end

1、要实现UITextView的placeholder功能主要是在UITextView上添加一个UILabel,当键盘弹起或者开始输入文字的时候,将此UILabel隐藏掉即可,当文字长度= 0,此UILabel又显示

2、输入文本限制,到了一定长度不让输入,这里没有针对中英文,特殊符号进行占位符区分,大家可以候补一下

这里博主遇到一个问题,就是在UITextView上添加UILabel发现图层上没有显示,大家遇到可以帮忙解释一下,感激不尽!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值