調(diào)整TextField占位文字顏色

需求:
1.通過不同狀態(tài)調(diào)整TextField占位文字顏色
2.編輯狀態(tài)下為WhiteColor;默認LightGrayColor
文字描述較為抽象,直接看效果圖:

01-占位文字顏色效果.gif

實現(xiàn)方式一

實現(xiàn)思路:
設(shè)置TextField代理,實現(xiàn)<UITextFieldDelegate>協(xié)議方法,在開始編輯時,通過富文本直接對TextFieldattributedPlaceholder賦值,同理,在編輯結(jié)束后同樣操作

當(dāng)然,在為TextField設(shè)置占位文字時,也需要通過富文本對attributedPlaceholder屬性進行賦值

- (void)textFieldDidBeginEditing:(JSLoginTextField *)textField {
    NSMutableAttributedString *placeholderText = [[NSMutableAttributedString alloc] initWithAttributedString:textField.attributedPlaceholder];
    [placeholderText addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, placeholderText.length)];
    textField.attributedPlaceholder = placeholderText;
}
- (void)textFieldDidEndEditing:(JSLoginTextField *)textField {
    NSMutableAttributedString *placeholderText = [[NSMutableAttributedString alloc] initWithAttributedString:textField.attributedPlaceholder];
    [placeholderText addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(0, placeholderText.length)];
    textField.attributedPlaceholder = placeholderText;
}

實現(xiàn)方式二

實現(xiàn)思路:
實現(xiàn)代理的方式有點大材小用了,其實還可以addTarget的方式
分別在UIControlEventEditingDidBeginUIControlEventEditingDidEnd中做上面的操作


實現(xiàn)方式三

實現(xiàn)思路:
通知,在自定義TextField中,分別監(jiān)聽UITextFieldTextDidBeginEditingNotificationUITextFieldTextDidEndEditingNotification,在接收到對應(yīng)通知后,在方法中執(zhí)行上面的操作

[[NSNotificationCenter  defaultCenter] addObserver:self selector:@selector(beingEditing:) name:UITextFieldTextDidBeginEditingNotification object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditing:) name:UITextFieldTextDidEndEditingNotification object:self];
注意點:
  • 自定義的TextField默認注冊了通知,也就意味著實例化出的每一個實例都注冊了通知,因此一旦接受到了通知,整個視圖內(nèi)自定義的TextField都會去響應(yīng)對應(yīng)的方法

    e.g. 我這個界面,有兩個文本框(賬號密碼),當(dāng)賬號輸入框獲取焦點時,密碼也接收到了通知,修改占位文本框字體顏色會讓兩個文本框同時發(fā)生改變,并不能滿足我們的需求(獲取焦點時白色,失去焦點的灰色),所以要做限制處理,讓賬號密碼輸入框只監(jiān)聽自己發(fā)出的通知,也就是在自定義TextField注冊通知時,將object參數(shù)傳入自己,這樣就滿足了每一個文本框只監(jiān)聽自己發(fā)出的通知

  • 在收到TextField發(fā)布通知執(zhí)行的方法中,通過參數(shù)notification.object獲取到對應(yīng)的TextField,執(zhí)行后面的操作

  • 使用通知,切記在dealloc中移除通知


實現(xiàn)方式四

實現(xiàn)思路:
1.自定義TextField;
2.通過RunTime獲取到私有屬性placeholderLabel占位文本框;
3.重寫layoutSubviews方法,根據(jù)當(dāng)前TextField狀態(tài)通過KVC設(shè)置占位文本框字體顏色

- (void)layoutSubviews {
    [super layoutSubviews];
    if (self.isEditing) {
        [self setValue:[UIColor whiteColor] forKeyPath:@"placeholderLabel.textColor"];
    } else {
        // KVC 修改 占位文字顏色
        [self setValue:[UIColor lightGrayColor] forKeyPath:@"placeholderLabel.textColor"];
    }
}

實現(xiàn)方式五

實現(xiàn)思路:
重寫becomeFirstResponderresignFirstResponder方法,分別對當(dāng)前TextField處理

- (void)layoutSubviews {
    [super layoutSubviews];
    if (!self.isEditing) {
        [self setValue:[UIColor lightGrayColor] forKeyPath:@"placeholderLabel.textColor"];
    }
}
- (BOOL)becomeFirstResponder {
    [self setValue:[UIColor whiteColor] forKeyPath:@"placeholderLabel.textColor"];
    return [super becomeFirstResponder];
}

- (BOOL)resignFirstResponder {
    [self setValue:[UIColor lightGrayColor] forKeyPath:@"placeholderLabel.textColor"];
    return [super resignFirstResponder];
}

但需要注意一點,因為TextField在實例化時,默認并未設(shè)置placeholder屬性,TextField內(nèi)部子控件placeholderLabel采用一種懶加載機制,此時相當(dāng)于為nil,如果在自定義TextFieldinit方法中直接通過KVC方式設(shè)置默認狀態(tài)顏色是無意的,必須要保證在placeholderLabel存在的前提下設(shè)置才會有意義,而設(shè)置延遲的方式并不能完美解決這個問題,文字描述可能比較抽空,直接看圖便能更容易的發(fā)現(xiàn)這個問題:

02-占位文字顏色效果.gif

雖然beignEditendEdit下的狀態(tài)正常,但是剛剛展示視圖時,TextField的占位文字還是黑色,暫時想到的方法就是在layoutSubViews方法中(方式四中),將未編輯狀態(tài)下設(shè)置成灰色


總結(jié):

  • 方式一和方式二比較簡單粗暴,思路上仍以理解,直接利用了TextFieldattributedPlaceholder屬性,使用了富文本,而且需要在父視圖設(shè)置代理,實現(xiàn)協(xié)議方法或?qū)崿F(xiàn)監(jiān)聽事件;

當(dāng)然通過協(xié)議/addTarget的方式,也可以封裝到TextField內(nèi)部
① 將代理設(shè)置給自己,實現(xiàn)協(xié)議方法,但這種將代理設(shè)置給自己的方式不推薦使用,因為代理模式為一對一,我們將TextField的代理對象設(shè)置給了自己,而外界使用TextField并設(shè)置代理后,問題就來了
② 而addTarget的方式不受影響,在TextField內(nèi)部添加自己監(jiān)聽狀態(tài),在外界添加控制器監(jiān)聽TextField狀態(tài),當(dāng)條件滿足時,TextField控制器都會分別響應(yīng)自身內(nèi)部的事件,不受影響

  • 方式三,通知和代理、addTarget的思路類似,但是性能略差一些,而且照此需求實現(xiàn)的注意點相對其他方式較多

通知的特點是方法執(zhí)行所在線程取決于監(jiān)聽通知的位置,比如在主線程監(jiān)聽通知,那么收到通知后,方法將在主線程執(zhí)行,反之則在子線程,而大部分的系統(tǒng)方法均在主線程執(zhí)行,除了最常使用的addObserver:,還可以用另外一種指定線程的方式:

self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidBeginEditingNotification object:self queue:[[NSOperationQueue alloc] init] usingBlock:^(NSNotification * _Nonnull note) {
        // 執(zhí)行代碼
    }];
  • 方式四會使父視圖或控制器的代碼更加簡潔,關(guān)于TextField樣式的問題,完全封裝到自定義控件內(nèi)部,不需要外界考慮,使用更加靈活,同時又不需要過多的考慮,比如通知的監(jiān)聽鸠姨、移除,代理對外的影響等.
  • 方式五的實現(xiàn)也較為簡單,只是需要注意TextField初始默認狀態(tài)的設(shè)置時機

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末继谚,一起剝皮案震驚了整個濱河市邻薯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拗小,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異璃岳,居然都是意外死亡,警方通過查閱死者的電腦和手機悔捶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門铃慷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜕该,你說我怎么就攤上這事犁柜。” “怎么了堂淡?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵馋缅,是天一觀的道長扒腕。 經(jīng)常有香客問我,道長萤悴,這世上最難降的妖魔是什么瘾腰? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮覆履,結(jié)果婚禮上蹋盆,老公的妹妹穿的比我還像新娘。我一直安慰自己硝全,他們只是感情好栖雾,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柳沙,像睡著了一般岩灭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赂鲤,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天噪径,我揣著相機與錄音,去河邊找鬼数初。 笑死找爱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泡孩。 我是一名探鬼主播车摄,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仑鸥!你這毒婦竟也來了吮播?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤眼俊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疮胖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體环戈,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年澎灸,在試婚紗的時候發(fā)現(xiàn)自己被綠了院塞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡性昭,死狀恐怖拦止,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糜颠,我是刑警寧澤创泄,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布艺玲,位于F島的核電站,受9級特大地震影響鞠抑,放射性物質(zhì)發(fā)生泄漏饭聚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一搁拙、第九天 我趴在偏房一處隱蔽的房頂上張望秒梳。 院中可真熱鬧,春花似錦箕速、人聲如沸酪碘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兴垦。三九已至,卻和暖如春字柠,著一層夾襖步出監(jiān)牢的瞬間探越,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工窑业, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钦幔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓常柄,卻偏偏與公主長得像鲤氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子西潘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容