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使用時經常使用到的小點,若有紕漏請指正.

相關文章
相關標籤/搜索