UITextField限制输入长度,修改placeholder颜色和大小

一.修改placeholder的字体大小和颜色

iOS 6 之前使用KVC改变placeholder的字体颜色和大小

[textField setValue:[UIColor redColor]forKeyPath:@"_placeholderLabel.textColor"];  
[textField setValue:[UIFontboldSystemFontOfSize:14]forKeyPath:@"_placeholderLabel.font"];  

iOS6之后还可以使用attributedPlaceholder来设置

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
NSString *holderText = @"hello world!";
NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc]initWithString:holderText];
[placeholder addAttribute:NSForegroundColorAttributeName
                  value:[UIColor redColor]
                  range:NSMakeRange(0, holderText.length)];
[placeholder addAttribute:NSFontAttributeName
                  value:[UIFontboldSystemFontOfSize:14]
                  range:NSMakeRange(0, holderText.length)];
textField.attributedPlaceholder = placeholder;
二.限制UITextField输入文字的长度

在输入用户名或者昵称的时候一般都有限制长度的需求. 一般的做法都是在

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string;   // return NO to not change text

这个代理方法中限制,当输入超过一定的长度时,不让输入.但是这种方法有两个问题:

1.当输入法是中文时,点击 "联想"的文字并不会走这个代理方法,所以无法限制.

2.当输入是中文时, 由于shouldChangeCharactersInRange判断的是当前键盘的字符数, 会出现这样的问题: 比如你还剩下2个字可以打, 你想输入"张三", "张"的拼音是Zhang, 于是你在输入Zh的时候就无法输入了. (输入英文是可以的)

针对问题1可以配合下面两个方法解决:

// 监听文本改变的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) 
name:UITextFieldTextDidChangeNotification object:nil];

或者

// 添加target监听文字改变
[textField addTarget:self action:@selector(textChanged:) 
forControlEvents:UIControlEventEditingChanged];

textChanged:方法中截取相应长度的字符串.  但是因为问题2的存在 这种截取并不精准.

在网上查了资料找到了一种比较靠谱的限制输入文字长度的方法通过监听文本改变的通知:

// 监听文本改变的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) 
name:UITextFieldTextDidChangeNotification object:nil];


或者是添加target事件监听问题改变:

// 添加target监听文字改变
[textField addTarget:self action:@selector(textChanged:) 
forControlEvents:UIControlEventEditingChanged];

然后在 textChanged:方法中设置:

- (void)textChanged:(UITextField *)textField {
    
    NSInteger maxLength = 18;
    NSString *toBeString = textField.text;
    NSString *lang = [textField.textInputMode primaryLanguage];
    if ([lang isEqualToString:@"zh-Hans"])// 简体中文输入
    {
        //获取高亮部分
        UITextRange *selectedRange = [textField markedTextRange];
        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
        
        // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if (!position)
        {
            
            if (toBeString.length > maxLength)
            {
                NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:maxLength];
                if (rangeIndex.length == 1)
                {
                    textField.text = [toBeString substringToIndex:maxLength];
                }
                else
                {
                    NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)];
                    textField.text = [toBeString substringWithRange:rangeRange];
                }
            }
        }
    }
    // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
    else
    {
        if (toBeString.length > maxLength)
        {
            NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:maxLength];
            if (rangeIndex.length == 1)
            {
                textField.text = [toBeString substringToIndex:maxLength];
            }
            else
            {
                NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxLength)];
                textField.text = [toBeString substringWithRange:rangeRange];
            }
        }
    }
}

这种做法对第三方输入法(如:搜狗,百度等)也是有效的.

三.修改textFieldplaceholder的位置以及输入内容的位置.

默认textField输入的文字以及placeholder都是从起始位置,这样看起来效果非常的不好,所以我们在实际使用的时候往往让输入文本的位置及placeholder的位置往后挪挪.具体的做法是: 重新一个类继承自 UITextField

然后重写:


// placeholder往后挪15个点
- (CGRect)placeholderRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 15, 0);
}
// 文本编辑的位置往后挪15个点 
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 15, 0);
}
// 文本位置
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 15, 0);
}

这两个方法即可.

UITextField还有其他的一些方法,有兴趣的同学可以自己尝试下.

- (CGRect)borderRectForBounds:(CGRect)bounds;
- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)clearButtonRectForBounds:(CGRect)bounds;
- (CGRect)leftViewRectForBounds:(CGRect)bounds;
- (CGRect)rightViewRectForBounds:(CGRect)bounds;

以上三点就是我在使用UITextField使用时常用到的小点,如有纰漏请指正.

转载于:https://my.oschina.net/zhxx/blog/756776

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值