自定義文本框佔位顏色和runtime

請耐心看完這篇文章,你會發現驚喜。當我看到這個需求的時候,首先腦海裏就有個思路,既然和系統給的不一樣,那肯定就要自定義了,最開始我並不知道怎麼改,所以我點進去,UITextField類裏面,既然是佔位顏色,所以我就搜索place,就發現了


這兩個屬性,想都不用想,肯定我們對第二個屬性進行操作,在這裏牽扯到了小邏輯的處理,就是要監聽開始編輯和結束編輯的狀態,用什麼監聽呢?

開發中監聽事件用到三種:1.代理 2.通知 3.target  

用代理?代理中有一個原則:永遠不要自己成爲自己的代理,我們在自定義的textField中設置代理這不搞笑呢,通知?跨多界面傳值一般才用,所以這裏用 target最合適


功能實現了,可是呢,作爲開發人員,改個顏色寫這麼多代碼有些不恰當吧,所以又想到了什麼?是不是想到了給自定義的類添加一個placeholder的屬性,給類添加屬性,不錯就是分類了。


分類中是有set和get方法的,只是沒實現沒有有帶下劃線的屬性而已,寫好以後,直接在自定義的類裏面直接就

   self.lsPlacehoder = self.placeholder;

這樣可否簡單多了,但是還是有點遺憾,這樣很不直觀,不太能夠讀懂我們最希望的就是直接self.placeholder = [UIColor WhiteColor]這樣是不是就簡單粗暴了,

所以繼續觀察,佔位文字猜測應該是一個label,我們使用


觀察


這就是我們想要的控件UITextFieldLabel,所以我們確定了我們需要一個label的屬性,點擊進去看發現,蘋果官方只是聲明瞭一下,並沒有給我們詳細說明裏面的屬性,猜測是隱藏的私有屬性,所以如何獲得label的屬性呢,這裏用比較簡單的方式打斷點,runtime也能獲得屬性,但是太麻煩,而且什麼都不知道的情況下不利於鎖定,怎麼簡單怎麼來


現在知道設置佔位屬性真正的label,是_placeholderLabel,所以獲取這個label得用KVC

UILabel *placehoderlabel = [self valueForKey:@"placeholderLabel"];

    placehoderlabel.textColor = [UIColor lightGrayColor];

一點問題沒有,這時候哈哈哈,可以在分類裏寫,外界可以直接設置顏色了

分類中


自定義textField類中


這樣就可以了,但是呢小夥伴可以測試一下,這樣寫是有BUG的,經過測試發現我們只有先設置佔位文字,後設置佔位顏色纔可以,調換順序後是不行的,查詢了一些解決方法,發現因爲OC中控件都是懶加載,我們要想完美的解決這個問題,必須事先將佔位顏色保存起來,等到用到的時候再去調用,想到這,給系統添加屬性和方法第一個反應就是runtime運行時

做一個小測試



這樣調用lsPlacehoder就可以實現設置文字和顏色無序了,可是這樣調用不是我們的終極目標,我們希望直接調用placeholder直接設置,所以用runtime交換兩個方法,


哈哈完美這樣的話,我們不管怎麼設置文字或者顏色,都可以設置上啦。


發佈了42 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章