iOS中UITextField的字數限制

2021-07-08 18:41:59 字數 1931 閱讀 9813

字數1172

閱讀339

喜歡1

這樣在輸入全部是英文的情況下是可以的. 但是當輸入是中文時, 由於shouldchangecharactersinrange判斷的是當前鍵盤的字元數, 會出現這樣的問題: 比如你還剩下2個字可以打, 你想輸入"張三", "張"的拼音是zhang, 於是你在輸入zh的時候就無法輸入了. 顯然, 這樣的結果不是我們想要的.

而且,shouldchangecharactersinrange也沒有響應最後拼音到漢字的過程.

在viewdidload中註冊通知.

[[nsnotificationcenter defaultcenter]

addobserver:self selector:@selector(textfilededitchanged:)

name:@"uitextfieldtextdidchangenotification" object:mytextfield]

;

然後實現監聽方法:

-(void)textfilededitchanged:(nsnotification *)obj

} // 有高亮選擇的字串,則暫不對文字進行統計和限制

else

} // 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況 else

}}

一切看起來, 似乎還不錯. 通過擷取字元來達到目的.然後導師告訴我, 碰到emoji就掛了. 假設限制輸入15個字元, 第十五個字元如果輸入是emoji, 則emoji不能正常顯示. 因為emoji是兩個字元大小.

使用rangeofcomposedcharactersequencesforrange, 防止在range範圍內整詞被截斷.

但是ios貌似不能正確識別中文的composed character sequences, 只要是兩個中文字都會被識別成composed character sequences. 恰好, 輸入emoji時currentinputmode也不是zh-hans. 因此, 在判斷當前輸入mode是中文時, 可以繼續使用substringtoindex, 進行截斷. 在非中文mode時, 加以判斷.

**如下:

#pragma mark - notification method

-(void)textfieldeditchanged:(nsnotification *)obj}}

// 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況

else

else}}

}

uitextfield *textfield = (uitextfield *)obj.object;

nsstring *tobestring = textfield.text;

//獲取高亮部分

uitextrange *selectedrange = [textfield markedtextrange];

uitextposition *position = [textfield positionfromposition:selectedrange.start offset:0];

// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制

if (!position)

else}}

iOS中改變uiTextField的游標起始位置

uitextfield作為輸入框,在很多場景都會使用,一般我們都是對齊預設的布局做一些更改,常用的可能會修改游標的顏色,placeholder的顏色,字型等等,有些修改直接設定uitextfield的屬性就可以,有些則沒有,需要重寫它提供的一些方法才可以,有些則怎麼都辦不到,例如修改游標的寬度,如果...

iOS中UITextField的字數限制

這樣在輸入全部是英文的情況下是可以的.但是當輸入是中文時,由於shouldchangecharactersinrange判斷的是當前鍵盤的字元數,會出現這樣的問題 比如你還剩下2個字可以打,你想輸入 張三 張 的拼音是zhang,於是你在輸入zh的時候就無法輸入了.顯然,這樣的結果不是我們想要的.而...

ios中的UITextField使用大全

textrectforbounds 重寫來重置文字區域 drawtextinrect 改變繪文字屬性.重寫時呼叫super可以按預設圖形屬性繪製,若自己完全重寫繪製函式,就不用呼叫super了.placeholderrectforbounds 重寫來重置佔位符區域 drawplaceholderin...