在iOS中能夠用于文本輸入的就兩種控件,分別是:UITextField,UITextView
那么我們?cè)诙ㄖ戚斎肟虻臅r(shí)候,我們到底是選擇UITextField,還是UITextView呢??
分析:
一般來說,輸入框是要輸入多行文字的,并且還應(yīng)該有占位文字提示用戶可以輸入什么樣的內(nèi)容,
了解了需求之后我就要做出選擇了,在做出選擇之前,我們有必要去研究一下UITextField,UITextView二者之間的差異,以做出最優(yōu)選擇
1.UITextField:
優(yōu)點(diǎn):能顯示占位文字
缺點(diǎn):只能顯示一行文字
2.UITextView:
有點(diǎn):能顯示多行文字
缺點(diǎn):不能顯示占位文字
問題來了,我們的需求是既要顯示占位文字,又要顯示多行文字,這個(gè)恰好是二者的結(jié)合體,因此我們只能通過自定義的方式去實(shí)現(xiàn)輸入框
解決方案:
1.自定義控件 LXBMutilRowTextField : UITextField
在能顯示占位文字的基礎(chǔ)上,添加能夠顯示多行文字的功能
2.自定義控件 LXBPlaceholderTextView : UITextView
在能顯示多行內(nèi)容的基礎(chǔ)上,添加占位文字的功能
選擇:
由于第一種方案要LXBMutilRowTextField能夠顯示多行內(nèi)容,難點(diǎn)在于控制光標(biāo)的移動(dòng),不好做
那么第二種方案就非常簡(jiǎn)單,我們只需要在LXBPlaceholderTextView中添加一個(gè)占位文字的功能,我們只需要通過繪圖的技術(shù)把占位文字繪制到LXBPlaceholderTextView中就可以了
關(guān)于接口的設(shè)計(jì):
我們給別人提供一個(gè)輸入框,我們要允許別人設(shè)置占位文字和占位文字的顏色,雖然說設(shè)置占位文字為灰色可以滿足絕大多數(shù)需求,但是從擴(kuò)展性上來講,我們?nèi)匀挥斜匾峁﹑laceholderColor這個(gè)接口,給別人更多的選擇
要注意的點(diǎn):
1.控制好光標(biāo)與占位文字的起始位置要對(duì)其(3,7)或者(4,8)都行
2.因?yàn)楣鈽?biāo)的高度將跟隨輸入文字的高度,因此為了保證占位文字的高度跟光標(biāo)一樣,我們就要保證占位文字的字體跟輸入文字的字體一樣
3.我們開放的屬性,方法這些接口給別人,就是要讓別人隨時(shí)隨刻都可以調(diào)用的,雖然說方便,強(qiáng)大,但由此帶來的副作用也需要我們要去處理的,比如在非常核心的
- (void)drawRect:(CGRect)rect
方法中,他只是在第一次顯示的時(shí)候被調(diào)用一次,但是呢別人又可以隨時(shí)隨地的修改占位文子的內(nèi)容,顏色,輸入文字的字體等等,為了解決這個(gè)問題,我們就必須要對(duì)占位文字進(jìn)行重繪:
注意點(diǎn):每次調(diào)用 - (void)drawRect:(CGRect)rect 方法時(shí),系統(tǒng)都會(huì)把以前繪制的東西全部都擦除,再重新繪制.利用這個(gè)特點(diǎn),我們就可以很好地控制占位文字的顯示與隱藏
具體使用:
不足之處:
由于UITextView : UIScrollView,所以我們可以讓我們自定義的輸入框有滾動(dòng)的效果:
但是由于我們先前用繪制的方式將占位文字給畫死了,占位文字不是LXBPlaceholderTextView的子控件,所以光標(biāo)可以滾動(dòng),但是占位文字卻不能滾動(dòng),怎么才能讓占位文字滾動(dòng)呢??
在LXBPlaceholderTextView上搞一個(gè)UILabel,再把占位文字顯示到UILabel上就可以了,UILabel作為UIScrollView的子控件個(gè),將隨UIScrollView的滾動(dòng)一起滾動(dòng)
基本使用: