- 顏色
UIColor * color = [UIColor greenColor];
[textField setValue:color forKeyPath:@"_placeholderLabel.textColor"];
- 字體
UIFont * font = [UIFont boldSystemFontOfSize:16];
[textField setValue:font forKeyPath:@"_placeholderLabel.font"];
- 水平居中
NSNumber * value = [NSNumber numberWithInteger:NSTextAlignmentCenter];
[textField setValue:value forKeyPath:@"_placeholderLabel.textAlignment"];
但是居右是不可以的!不知原因...
還有一種比較靈活的方法下面介紹民鼓,后面介紹...
-
垂直居中
placeholder
在UITextField
中的位置是以輸入文字光標(biāo)的上端點(diǎn)作為它的顯示位置薇芝,所以當(dāng)我們?cè)O(shè)置的placeholder
字體大小與textField
設(shè)置的輸入文字大小有差異時(shí),placeholder
的顯示位置就不會(huì)垂直居中而發(fā)生向下偏移丰嘉。
關(guān)于placeholder位置調(diào)整的解決方法:
首先我們需要?jiǎng)?chuàng)建一個(gè)繼承于UITextField
的新的TextField
夯到,我這里命名為CustomTextField
。
為什么要定義一個(gè)新的類呢饮亏?因?yàn)槲覀円貙?code>UITextField的一些函數(shù)來達(dá)到我們想要的效果耍贾。目前只有通過這種方式才能很準(zhǔn)確的調(diào)整placeholder
的位置阅爽。
下面介紹一下需要重寫的兩個(gè)函數(shù):
@implementation CustomTextField
// 返回placeholderLabel的bounds,改變返回值荐开,是調(diào)整placeholderLabel的位置
- (CGRect)placeholderRectForBounds:(CGRect)bounds {
return CGRectMake(0, 0 , self.bounds.size.width, self.bounds.size.height);
}
// 這個(gè)函數(shù)是調(diào)整placeholder在placeholderLabel中繪制的位置以及范圍
- (void)drawPlaceholderInRect:(CGRect)rect {
[super drawPlaceholderInRect:CGRectMake(0, -6 , self.bounds.size.width, self.bounds.size.height)];
}
@end
注意:被重寫函數(shù)中的
CGRectMake()
的值是需要根據(jù)你自己的需求進(jìn)行調(diào)整的付翁,并不是固定值。其實(shí)不難發(fā)現(xiàn)通過這種方式我們可以調(diào)整placeholder
到任意位置晃听,不單單是居中效果百侧。
至于CustomTextField
的使用和正常UITextField
的使用是一樣的,這里不貼它的使用代碼了能扒。
通過代碼中的注釋我們可以知道這兩個(gè)被我們重寫的函數(shù)的作用佣渴,其實(shí)正常使用時(shí)這兩個(gè)函數(shù)并不需要同時(shí)調(diào)整,我們可以通過重寫其中一個(gè)函數(shù)就可以調(diào)整placeholder
的位置初斑,當(dāng)然你也可以同時(shí)重寫這兩個(gè)函數(shù)來調(diào)整你的placeholder
到指定的位置辛润。
下面再補(bǔ)充一個(gè)我們平時(shí)比較頭疼問題的解決辦法:
在我們使用原生UITextField
的時(shí)候,不管是輸入文字還是placeholder
都是緊挨著UITextField
的邊緣的见秤,就像上面效果中文字都是緊挨著輸入框的左側(cè)邊緣的砂竖,看起來很丑。
那么我們通過重寫方法秦叛,給UITextField
添加一個(gè)左邊距晦溪,如下
@implementation CustomTextField
// 控制還未輸入時(shí)文本的位置,縮進(jìn)40
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset( bounds, 40, 0);
}
// 控制輸入后文本的位置挣跋,縮進(jìn)20
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectInset( bounds, 20, 0);
}
@end
從效果圖中可以看出在鼠標(biāo)還沒點(diǎn)擊輸入框的時(shí)候文字縮進(jìn)距離是
40
三圆,當(dāng)點(diǎn)擊輸入框出現(xiàn)光標(biāo)后,文字的縮進(jìn)距離是20
避咆。
而且我們也看到了效果中placeholder
沒有垂直居中舟肉,那是因?yàn)闉榱丝吹捷斎肭昂洼斎牒蟮目s進(jìn)不同距離的效果我將之前重寫的:
- (CGRect)placeholderRectForBounds:(CGRect)bounds
- (void)drawPlaceholderInRect:(CGRect)rect
函數(shù)注釋掉了。因?yàn)檫@兩個(gè)函數(shù)會(huì)令我們剛才設(shè)置的輸入前的縮進(jìn)距離失效查库。
關(guān)于placeholder如果你有好的方法可以在評(píng)論區(qū)留言路媚,大家一起來探討。
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 樊销,轉(zhuǎn)載時(shí)必須注明出處及相應(yīng)鏈接整慎!