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

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

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

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

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

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

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

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

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的存在 这种截取并不精准.get

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

// 监听文本改变的通知
[[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使用时经常使用到的小点,若有纰漏请指正.

相关文章
相关标签/搜索