UITextView默認(rèn)提示文字及字符長(zhǎng)度限制( UITextView+placeholder+maxInputLength)

場(chǎng)景

在我們進(jìn)行客戶端開發(fā)的時(shí)候,用戶的反饋意見對(duì)我們來說至關(guān)重要,所以意見反饋也就成為我們必不可少的一個(gè)界面琉苇,大部分意見反饋的頁面都是這個(gè)樣子的

09DA507D-CFA5-4FE4-97E9-59511BF9F563.png

主要分為兩個(gè)功能 ** 默認(rèn)占位文字 ** 輸入限制

目標(biāo)

  • 為textView添加默認(rèn)文字(placeholder)
  • 限制textView的輸入文字

實(shí)現(xiàn)方法

(一)添加placeholder

添加placeholder的方法有很多滚躯,我采用的是繪制的方法,根據(jù)需要制定繪制的Attributes重寫dranRect方法利用
[self.placeholder drawInRect:rect withAttributes:attrs];
方法講文字繪制在textView上风宁,然后根據(jù)hasText屬性來控制是否繪制

完整功能如下

if (self.hasText) {
        return;
    }
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = self.font;
    attrs[NSForegroundColorAttributeName] = self.placeholderColor==nil?[UIColor blackColor]:self.placeholderColor;
//為了美觀可以稍微偏移一下,具體數(shù)值自己定義
    rect.origin.x = 5;
    rect.origin.y = 8;
    rect.size.width -= 2 * rect.origin.x;
    [self.placeholder drawInRect:rect withAttributes:attrs];

要注意的是一般我們會(huì)把placeholder的文字大小定義成跟輸入文字一樣的大小蛹疯,顏色會(huì)自定義所以別忘了重寫textView的font屬性的set方法以及placeholderColor和placeholderString的set方法添加上
[self setNeedsDisplay];

(二)添加字?jǐn)?shù)限制

一般來說監(jiān)聽textView文字變化的方法有兩種

  • 根據(jù)delegate中的textViewDidChange方法來監(jiān)聽文字變化
  • 添加通知UITextViewTextDidChangeNotification名來監(jiān)聽文字變化

無論哪種方法我們都可以獲取到當(dāng)前textView的文字變化從而進(jìn)行操作戒财,可以通過

 if (self.text.length > self.maxInputLength) {
            self.text = [self.text substringToIndex:self.maxInputLength];
        } 

直接將文字截取至限定字符的數(shù)量,但是這樣做有個(gè)問題捺弦,在用蘋果自帶鍵盤輸入的時(shí)候會(huì)發(fā)現(xiàn)輸入不下去的文字饮寞,這是因?yàn)樘O果自帶鍵盤在中文輸入法的時(shí)候會(huì)把拼音以選中高亮的形式輸入進(jìn)textView從而觸發(fā)textView的文字變化到了你限定的數(shù)量就會(huì)輸入不進(jìn)去了 孝扛,所以我們要對(duì)蘋果鍵盤的中文輸入法單獨(dú)做處理

// 獲取選中部分
        UITextRange *selectedRange = [self markedTextRange];
        
        //獲取選中部分的偏移量, 此部分為用戶未決定輸入部分
        UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];

通過選中狀態(tài)的有無來判斷是否應(yīng)該進(jìn)行截取。

NSString *InputMethodType = [[UIApplication sharedApplication]textInputMode].primaryLanguage;
    
    // 如果當(dāng)前輸入法為漢語輸入法
    if ([InputMethodType isEqualToString:@"zh-Hans"]) {
        
        // 獲取選中部分
        UITextRange *selectedRange = [self markedTextRange];
        
        //獲取選中部分的偏移量, 此部分為用戶未決定輸入部分
        UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
        
        // 當(dāng)沒有標(biāo)記部分時(shí)截取字符串
        if (position == nil) {
            if (self.text.length > self.maxInputLength) {
                self.text = [self.text substringToIndex:self.maxInputLength];
            }
        }
    }else {
        if (self.text.length > self.maxInputLength) {
            self.text = [self.text substringToIndex:self.maxInputLength];
        }
    }

至此功能算是都實(shí)現(xiàn)了幽崩,但是為了封裝性和易用性苦始,所以我們還需要整理一下,可以使用分類的方式給UITextView添加上placeholder和maxInputLenth屬性以便更好的使用
具體代碼在git地址上喜歡的話請(qǐng)點(diǎn)個(gè)star哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慌申,一起剝皮案震驚了整個(gè)濱河市陌选,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹄溉,老刑警劉巖咨油,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柒爵,居然都是意外死亡役电,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門棉胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來法瑟,“玉大人,你說我怎么就攤上這事唁奢■” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵麻掸,是天一觀的道長(zhǎng)酥夭。 經(jīng)常有香客問我,道長(zhǎng)论笔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任千所,我火速辦了婚禮狂魔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淫痰。我一直安慰自己最楷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布待错。 她就那樣靜靜地躺著籽孙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪火俄。 梳的紋絲不亂的頭發(fā)上犯建,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瓜客,去河邊找鬼适瓦。 笑死竿开,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玻熙。 我是一名探鬼主播否彩,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嗦随!你這毒婦竟也來了列荔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤枚尼,失蹤者是張志新(化名)和其女友劉穎贴浙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑原,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悬而,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锭汛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨奠。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唤殴,靈堂內(nèi)的尸體忽然破棺而出般婆,到底是詐尸還是另有隱情,我是刑警寧澤朵逝,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布蔚袍,位于F島的核電站,受9級(jí)特大地震影響配名,放射性物質(zhì)發(fā)生泄漏啤咽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一渠脉、第九天 我趴在偏房一處隱蔽的房頂上張望宇整。 院中可真熱鬧,春花似錦芋膘、人聲如沸鳞青。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臂拓。三九已至,卻和暖如春习寸,著一層夾襖步出監(jiān)牢的瞬間胶惰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工霞溪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留童番,地道東北人精钮。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剃斧,于是被迫代替她去往敵國和親轨香。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫幼东、插件臂容、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • 我坦然,于是我心美麗散庶。我心美麗蕉堰,于是我的人生跟著美麗”辏——余秋雨 天空不留下鳥的痕跡屋讶,但我已飛過⌒虢蹋——泰戈?duì)?/div>
    魏道道女王閱讀 297評(píng)論 0 0
  • 如花的少女皿渗,寂寞地讀著書,寂寞鎖住她的心轻腺,書里撫過寂寞的歲月和青春乐疆。孤單里書為伴,精神不頹廢贬养,依然少女心挤土。 少女芬...
    南溪向南北歌流海閱讀 222評(píng)論 0 0