這樣在輸入全部是英文的情況下是可以的. 但是當輸入是中文時, 由於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的字數限制
字數1172 閱讀339 喜歡1 這樣在輸入全部是英文的情況下是可以的.但是當輸入是中文時,由於shouldchangecharactersinrange判斷的是當前鍵盤的字元數,會出現這樣的問題 比如你還剩下2個字可以打,你想輸入 張三 張 的拼音是zhang,於是你在輸入zh的時候就無法輸入了....
ios中的UITextField使用大全
textrectforbounds 重寫來重置文字區域 drawtextinrect 改變繪文字屬性.重寫時呼叫super可以按預設圖形屬性繪製,若自己完全重寫繪製函式,就不用呼叫super了.placeholderrectforbounds 重寫來重置佔位符區域 drawplaceholderin...