亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS UITextField最大字符數和字節數的限制詳解

2020-07-26 03:03:36
字體:
來源:轉載
供稿:網友

前言

這里我給大家幾組測試用例可以一試,為啥不好用。

     1、限制10個字節,輸入2個Emoj之后是8個字節(一個Emoj是4個字節),此時再輸入一個中文,看看結果如何(中文的UTF8占3個字節)

     2、限制5個字符,一個Emoj是2個字符,其他都是一個。此時輸入兩個Emoj,再輸入中文,然后中文聯想試試。

就目前的情況來說,看了很多資料,并沒有一個通用的能限制字符數和字節數的封裝。這里全面進行了總結,并進行了封裝。歡迎大家下載。

一. 字符限制

1. 錯誤方法

常見的這種方法是錯誤的,會導致Emoj表情的截取問題

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ if(range.length + range.location > textField.text.length) { return NO; }  NSUInteger newLength = [textField.text length] + [string length] - range.length; return newLength <= 5;}

這種限制方法會導致拼音下出現這種情況,且無法輸入.無法輸入滿5個字符。在emoj表情也有問題

2. 推薦方法

使用rangeOfComposedCharacterSequencesForRange, 防止在range范圍內整詞被截斷

- (void)textFieldDidChange:(UITextField *)textField{ NSString *toBeString = textField.text; UITextRange *selectedRange = [textField markedTextRange]; UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];  // 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制,防止中文被截斷 if (!position){ if (toBeString.length > _maxLength){  //中文和emoj表情存在問題,需要對此進行處理  NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, _maxLength)];  textField.text = [toBeString substringWithRange:rangeRange]; } }}

二. 字節限制

1. 限制字節數

在UTF8中,英文和數字是1個字節,漢子是3個字節,emoji是3或者4個字節。這里的難度比上面更大,如果截取失敗,極有可能出現亂碼。這里我們的做法如下

- (void)textFieldDidChange:(UITextField *)textField{ NSString *toBeString = textField.text; //---字節處理 NSInteger bytesCount = strlen([textField.text UTF8String]); if (bytesCount > _maxBytesLength) { NSString *content = [textField.text subStrWithUtf8Len:(int)_maxBytesLength]; textField.text = content; }}- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  NSString * inputString = [textField.text stringByReplacingCharactersInRange:range withString:string];  //限制字節數 if ([inputString length] > 0){ NSInteger len = strlen([inputString UTF8String]); if (len > _maxBytesLength){  return NO; } else {  return YES; } } return YES;}

這里不能只在進行限制,在textFieldDidChange中需要對中文聯想做處理才行

三. 放棄鍵盤

1. 能拿到uitextfield的時候用

- (BOOL)textFieldShouldReturn:(UITextField *)textField{ return [textField resignFirstResponder];}

2. 點擊view消失的時候用

[self.view endEditing:YES];

3. 難以獲取的時候用

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

或者

[[[UIApplication sharedApplication] keyWindow] endEditing:YES];

4.Tableview點擊空白處或者滾動時消失

{ UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fingerTapped:)]; [self.view addGestureRecognizer:singleTap];}#pragma mark- 鍵盤消失-(void)fingerTapped:(UITapGestureRecognizer *)gestureRecognizer{ [self.view endEditing:YES];}-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ [self.view endEditing:YES];}

四. 正則表達式限制

請參考 正則表達式語法表 ,這里我提供了兩種表達式給大家參考,一個Int,一個無unsignedInt

-(BOOL) isTextFieldMatchWithRegularExpression:(NSString *)exporession{  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",exporession]; return [predicate evaluateWithObject:self];}-(BOOL) isTextFieldIntValue{ return [self isTextFieldMatchWithRegularExpression:@"[-]{0,1}[0-9]*"];}-(BOOL) isTextFieldUnsignedIntValue{ return [self isTextFieldMatchWithRegularExpression:@"[0-9]+"];}

五. UITextfield的鍵盤事件多次回調問題

1.鍵盤高度遮擋問題

一般出現遮擋的時候我們用以下代碼,看看當前textfield是否在鍵盤下面,在的話算出鍵盤的頂端和textfield的底部的距離,然后做偏移動畫

- (void)keyboardWillShow:(NSNotification *)notification {  NSDictionary *userInfo = [notification userInfo];  NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; CGRect keyboardRect = [aValue CGRectValue]; keyboardRect = [self.view convertRect:keyboardRect fromView:nil];  CGFloat keyboardTop = keyboardRect.origin.y;  CGFloat offset = self.normalTextField.frame.size.height + self.normalTextField.frame.origin.y - keyboardTop;  NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration; [animationDurationValue getValue:&animationDuration];  if(offset > 0){ // Animate the resize of the text view's frame in sync with the keyboard's appearance. [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; CGRect rect = CGRectMake(0.0f, -offset,self.view.frame.size.width,self.view.frame.size.height); self.view.frame = rect; [UIView commitAnimations]; }}

1、真機

如果使用了中文輸入法,注冊的keyboardWillShow會回調兩次。第一次是鍵盤默認高度216,第二次則是加了keyboard的導航欄的高度。

2、模擬器

第一次彈出鍵盤沒有問題

打印userinfo:

(lldb) po userInfo{ UIKeyboardAnimationCurveUserInfoKey = 7; UIKeyboardAnimationDurationUserInfoKey = "0.25"; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 226}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 849}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 623}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 736}, {414, 226}}"; UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 510}, {414, 226}}"; UIKeyboardIsLocalUserInfoKey = 1;}

此時我們去按123旁邊的小圓球會出現如下的圖:

打印userinfo:

(lldb) po userInfo{ UIKeyboardAnimationCurveUserInfoKey = 7; UIKeyboardAnimationDurationUserInfoKey = "0.25"; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 623}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 600.5}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 510}, {414, 226}}"; UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 465}, {414, 271}}"; UIKeyboardIsLocalUserInfoKey = 1;}

鍵盤被遮擋了。

總結:觀察結果,發現了這個規律,打印一下時間,還有一個問題就是,中文鍵盤第一次啟動的時候會回調兩次。

keyboardRect = [self.view convertRect:keyboardRect fromView:nil];

所以去掉這句話即可

六. 使用封裝的XXTextField

UITextView , UITextfield 中如果有keyboard的時候,需要一個自動彈起事件,以及彈起之后的content的偏移對父view的處理。如果每個頁面都實現一次會非常復雜。這里我們介紹一種自動化的處理機制。在此之前,先介紹一下文字處理框架.最后給大家推薦一下我寫的 XXTextField ,大家也可以在此基礎上自己添加一些正則表達式。

1.解決uiview中的textfield 遮擋問題

_textfieldName.keyboardType = UIKeyboardTypeDefault;_textfieldName.inputType = XXTextFieldTypeOnlyInt;_textfieldName.maxLength = 5;_textfieldPwd.inputType = XXTextFieldTypeForbidEmoj;#import "XXKeyboardManager.h"@interface XXCorrectVC ()<XXKeyboardManagerShowHiddenNotificationDelegate>@end@implementation XXCorrectVC- (void)viewDidLoad { [super viewDidLoad]; [[XXKeyboardManager sharedInstance] setDelegate:self]; // Do any additional setup after loading the view from its nib.}#pragma mark- KeyBoardShow/Hidden- (void)showKeyboardWithRect:(CGRect)keyboardRect    withDuration:(CGFloat)animationDuration{ CGFloat offset = self.textFieldCorrect.frame.size.height + self.textFieldCorrect.frame.origin.y - keyboardRect.origin.y; if(offset < 0){  return; } [UIView animateWithDuration:animationDuration       delay:0.f      options:UIViewAnimationOptionCurveEaseInOut animations:^{  CGRect rect = CGRectMake(0.0f, -offset,self.view.frame.size.width,self.view.frame.size.height);  self.view.frame = rect; } completion:^(BOOL finished) {   }];}- (void)hiddenKeyboardWithRect:(CGRect)keyboardRect     withDuration:(CGFloat)animationDuration{ [UIView animateWithDuration:animationDuration       delay:0.f      options:UIViewAnimationOptionCurveEaseInOut animations:^{  self.textFieldCorrect.frame = self.view.bounds; } completion:^(BOOL finished) { }];}@end

2.解決uitableview中鍵盤遮擋問題

/* * 鍵盤要顯示的時候 */- (void)showKeyboardWithRect:(CGRect)keyboardRect    withDuration:(CGFloat)animationDuration{  CGSize kbSize = keyboardRect.size;  UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); _baseTableView.contentInset = contentInsets; _baseTableView.scrollIndicatorInsets = contentInsets;  // If active text field is hidden by keyboard, scroll it so it's visible // Your app might not need or want this behavior. CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height;  if (!CGRectContainsPoint(aRect, _activeCell.frame.origin) ) {  [_baseTableView scrollRectToVisible:_activeCell.frame animated:YES]; }}/* * 鍵盤要消失的時候 */- (void)hiddenKeyboardWithRect:(CGRect)keyboardRect     withDuration:(CGFloat)animationDuration{ _baseTableView.contentInset = UIEdgeInsetsZero; _baseTableView.scrollIndicatorInsets = UIEdgeInsetsZero;}

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位Android開發者們能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人xx| 亚洲一区久久久| 日本高清久久天堂| 精品久久中文字幕| 亚洲精品91美女久久久久久久| 欧美色欧美亚洲高清在线视频| 国内精久久久久久久久久人| 久久精品国产亚洲精品| 成人欧美一区二区三区黑人| 久久精品视频在线播放| 911国产网站尤物在线观看| 97在线观看视频| 日韩av不卡在线| 国产精彩精品视频| 久久国产一区二区三区| 亚洲日本中文字幕免费在线不卡| 18性欧美xxxⅹ性满足| 一区二区三区视频免费在线观看| 成人福利免费观看| 久久精品在线播放| 国产大片精品免费永久看nba| 欧美成人第一页| 91精品国产高清久久久久久久久| 国产成人高潮免费观看精品| 欧美激情视频一区二区| 亚州国产精品久久久| 亚洲精品www| 欧美激情一二区| 自拍偷拍免费精品| 亚洲国产高清高潮精品美女| 777精品视频| 久久久久久中文字幕| 国产精品av电影| 日韩成人中文字幕在线观看| 久久免费观看视频| 国产精品视频区1| 97精品国产97久久久久久| 国产精品免费一区二区三区都可以| 日韩av在线电影网| 在线观看视频99| 日韩一级裸体免费视频| 久久久噜噜噜久久中文字免| 国产国语videosex另类| 国产欧美精品va在线观看| 一区二区三区 在线观看视| 国产一区二区动漫| 国产福利精品视频| 国产精品久久久久7777婷婷| 国产精品视频网| 亚洲人成在线一二| 亚洲人成77777在线观看网| 欧美性受xxx| 欧美影院在线播放| 国产91网红主播在线观看| 欧美大成色www永久网站婷| 色综合五月天导航| 神马国产精品影院av| 亚洲黄色www网站| 亚洲国产精品人人爽夜夜爽| 欧美极品在线播放| 国内成人精品视频| 亚洲a一级视频| 国内精品小视频在线观看| 亚洲精品综合精品自拍| 91香蕉电影院| 日韩av手机在线| 亚洲人成电影网站色| 日韩av最新在线| 久久久久久久久久婷婷| 尤物yw午夜国产精品视频| 成人黄色免费片| 亚洲人午夜精品免费| www国产91| 日韩精品高清视频| 久久久久久久久国产精品| 九九精品在线视频| 欧美精品激情blacked18| 久久精品视频一| 国产视频精品va久久久久久| 高清欧美电影在线| 亚洲精品一区二区三区婷婷月| 精品视频偷偷看在线观看| 国内精品视频一区| 国产精品久久久久秋霞鲁丝| 国产热re99久久6国产精品| 色综合久久久888| 精品在线欧美视频| 精品国内产的精品视频在线观看| 亚洲深夜福利网站| 国产视频精品免费播放| 欧美网站在线观看| 久久久久久久久久久成人| 日韩风俗一区 二区| 久久成人免费视频| 国产不卡精品视男人的天堂| 97成人精品区在线播放| 国产亚洲一区精品| 久久久久久伊人| 麻豆国产精品va在线观看不卡| 国产精品欧美一区二区| 国产不卡av在线免费观看| 欧美激情一区二区三区成人| 欧洲s码亚洲m码精品一区| 久久久伊人日本| 国产午夜精品美女视频明星a级| 中文字幕久精品免费视频| 欧美日韩国产一区二区三区| 欧美日韩午夜激情| 久久久久久国产精品久久| 国产精品一区二区在线| 麻豆一区二区在线观看| 亚洲欧美成人在线| 中文字幕在线观看日韩| 亚洲电影免费观看高清完整版| 最近2019中文免费高清视频观看www99| 亚洲欧美日韩综合| 日本精品视频在线观看| 精品久久香蕉国产线看观看gif| 欧美第一淫aaasss性| 深夜福利一区二区| 日韩国产精品视频| 国产欧美日韩中文字幕| 在线精品视频视频中文字幕| 这里只有精品久久| 黑人巨大精品欧美一区二区| 久久久久久有精品国产| 亚洲人成啪啪网站| 2019中文字幕免费视频| 中文字幕欧美精品日韩中文字幕| 日本一区二区在线免费播放| 综合久久五月天| 91亚洲国产成人精品性色| 国产精品一区二区久久| 国产成人精品亚洲精品| 国产成人精品电影久久久| 亚洲女人天堂色在线7777| 亚洲欧洲在线播放| 欧美电影在线免费观看网站| 国产精品久久久久久亚洲影视| 九九热精品视频国产| 欧美大片在线免费观看| 亚洲人成网在线播放| 国产精品福利小视频| 久久青草精品视频免费观看| 川上优av一区二区线观看| 欧美精品免费在线观看| 国产综合在线观看视频| 欧美裸体男粗大视频在线观看| 亚洲国产精品久久| 亚洲人成五月天| 久久国内精品一国内精品| 欧美精品videofree1080p| 不卡av在线网站| 亚洲一区二区久久久久久久| 日韩在线一区二区三区免费视频| 国产原创欧美精品| 国产精品尤物福利片在线观看| 韩国19禁主播vip福利视频| 日韩电影第一页| 久久久综合av| 精品国产乱码久久久久久婷婷| 97超级碰碰人国产在线观看| 欧美国产激情18| 91久久久精品|