最終設置UITextField的placeholder效果(實際效果可能比這好一點點...):
有需求1如下:
- 未點擊時UITextField的placeholder為淺灰色
- 點擊后宾巍,還未進行輸入時戒幔,UITextField的placeholder變?yōu)樯罨疑?/li>
這個實現(xiàn)并不難:
- 通過通知或者重寫UITextField的響應者處理方法(becomeFirstResponder/resignFirstResponder)讨勤,都可以實現(xiàn)捕獲點擊時間
- UITextField設置placeholder可以使用以下屬性:
- 通過設置這個富文本屬性,可以得到豐富多彩的placeholder
- 通過設置這個富文本屬性,可以得到豐富多彩的placeholder
@NSCopying var attributedPlaceholder: NSAttributedString?
// 附帶光標顏色屬性
var tintColor: UIColor!
但是需求2加了點東西:
- 點擊后侠畔,還未進行輸入時扼脐,UITextField的placeholder文字左右進行小幅度抖動
可以看到通過設置attributedPlaceholder,可以改變一些靜態(tài)的屬性霎终,如顏色和文字大小。
但是如果需要里面的文字做一些簡單的抖動效果貌似就不行了升薯,UITextField沒有提供相關屬性莱褒,我們也不知道placeholder是在何種控件中顯示的。
既然不知道placeholder是在何種控件中顯示涎劈,那就通過以下代碼打印出UITextField中所有的成員變量(函數(shù)參考runtime基礎元素解析)广凸,看看是否會有什么發(fā)現(xiàn):
Ivar *ivars = class_copyIvarList([UITextField class], &outCount);
for (int i = 0; i < outCount; i++) {
Ivar ivar = ivars[i];
NSLog(@"%s", ivar_getName(ivar));
}
free(ivars);
截取關鍵部分如下:
從字面上看,上面的
_placeholderLabel
是否就是顯示placeholder的控件责语?測試實際結果的確是顯示placeholder的控件炮障。
只要有了這個控件目派,那要做一些小抖動的動畫那就沒什么問題了坤候,先獲取這個UILabel:
private var tpcPlaceholderLabel:UILabel? {
get {
return self.valueForKey("_placeholderLabel") as? UILabel
}
}
然后重寫UITextField的響應者處理函數(shù):
// 成為第一響應者
override func becomeFirstResponder() -> Bool {
if normalColor == nil {
normalColor = tpcPlaceholderLabel?.textColor
}
if selectedColor == nil {
selectedColor = tpcPlaceholderLabel?.textColor
}
tpcPlaceholderLabel?.textColor = selectedColor
UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.1, initialSpringVelocity: 10, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
tpcPlaceholderLabel?.transform = CGAffineTransformMakeTranslation(10, 0)
}, completion: nil)
return super.becomeFirstResponder()
}
// 放棄第一響應者
override func resignFirstResponder() -> Bool {
tpcPlaceholderLabel?.transform = CGAffineTransformIdentity
tpcPlaceholderLabel?.textColor = normalColor
return super.resignFirstResponder()
}
這樣就可以做簡單的抖動了
還有一點,根據(jù)上面打印的UITextField成員變量企蹭,看到了_displayLabel
白筹,這個就是在鍵盤輸入后顯示文字的UILabel了智末。這個屬性可以用來干嘛?
我想徒河,可能會有這么一種需求(不過可能沒有)系馆,就是用戶輸入錯誤時,UITextField中已經(jīng)輸入的文字做簡單左右抖動顽照,并且顏色變?yōu)榧t色由蘑,以間接的形式,輔助提醒用戶代兵,這一欄輸錯了尼酿,而不是彈出一個HUB
。
由于UITextField內(nèi)部做了某些處理植影,所以無法在成為第一響應者時做一些動作裳擎,那么,就在放棄第一響應者函數(shù)中思币。
相關代碼如下:
// 設置一個在放棄第一響應者調(diào)用的閉包屬性
var operateWhenResignFirstResponder: (() -> ())?
// 在func resignFirstResponder() -> Bool函數(shù)中調(diào)用
if let operate = operateWhenResignFirstResponder {
operate()
}