iOS:文字相关(19-01-08更)
0、写在前面
1、小技巧
UILabel类:
1-1-1)、设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效)。
UITextField类:
1-2-1)、清空按钮。
UITextView类:
1-3-1)、UITextView只能x轴居中,y轴需要手动调。
UITextField、UITextView类共有:
1-4-1)、在键盘上面显示一个右边有“完成”按钮的ToolBar。
1-4-2)、协议 UITextInputTraits(自动大写、纠错、键盘相关)。
1-4-3)、点击跳转到新页面
2、字体计算、自适应
3、键盘相关
0、写在前面
1、UILabel:
1、没有自带选择、复制功能
2、无占位符
3、多行
2、UITextField:
1、
2、有占位符
3、一行
3、UITextView:
1、
2、无占位符
3、多行
N、富文本,再次刷新,需要先置nil
1、小技巧:
UILabel类:
1-1-1)、设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效)。
// 最后面的,以"..."结束 self.contentLabel.lineBreakMode = NSLineBreakByTruncatingTail;
UITextField类:
1-2-1)、清空按钮。
// 当编辑时才出现 self.inputTF.clearButtonMode = UITextFieldViewModeWhileEditing;
1-2-N)、在tableView中响应。
1)、比如,输入用户名的cell,UITextField输入框在右边,左边有@“用户名”的label。想要整个cell响应输入框。可在cell的点击row代理中,获取当前cell的textField,然后becomeFirstResponder,用户体验好点。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 获取cell KJPersonalSettingCell *cell = [tableView cellForRowAtIndexPath:indexPath]; // 弹出输入法 [cell.inputTF becomeFirstResponder]; }
2)、比如,生日用datePicker,选中显示在cell,如果是用UITextField(考虑cell复用:如当前cell样式右边无label,有UITextField),可设置UITextField的enabled = NO,然后用在cell的点击row代理中跳出datePicker。
// cell复用,刷新数据中设置为NO,就不响应输入事件 self.inputTF.enabled = NO; // 然后由cell点击事件弹出 datePicker - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { }
UITextView类:
1-3-1)、UITextView只能x轴居中,y轴需要手动调
--修改自简书 《IOS UITextView内容垂直居中方法》 --木头Lee
- (void)contentSizeToFit { //先判断一下有没有文字(没文字就没必要设置居中了) if([msgTextView.text length]>0) { //textView的contentSize属性 CGSize contentSize = msgTextView.contentSize; //textView的内边距属性 UIEdgeInsets offset; //如果文字内容高度没有超过textView的高度 if(contentSize.height <= msgTextView.height) { //textView的高度减去文字高度除以2就是Y方向的偏移量,也就是textView的上内边距 CGFloat offsetY = (msgTextView.height - contentSize.height)/2; offset = UIEdgeInsetsMake(offsetY, 0, 0, 0); } //根据前面计算设置textView的ContentSize和Y方向偏移量 [msgTextView setContentInset:offset]; } }
UITextField、UITextView类共有:
1-4-1)、在键盘上面显示一个右边有“完成”按钮的ToolBar。
UIToolbar *numberToolBar= [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, kSCREEN_WIDTH, 40)]; numberToolBar.items = [NSArray arrayWithObjects: [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], [[UIBarButtonItem alloc]initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)], nil]; //numberToolBar.tintColor=[UIColor redColor]; self.inputTF.inputAccessoryView = numberToolBar; - (void)doneWithNumberPad { }
1-4-2)、协议 UITextInputTraits(自动大写、纠错、键盘相关):
①、autocapitalizationType:自动首字母大写
②、autocorrectionType:自动纠错
③、spellCheckingType:拼写检查
④、keyboardType:键盘类型
⑤、keyboardAppearance:键盘颜色样式
⑥、returnKeyType:返回的按键“字”:发送、下一个...
⑦、enablesReturnKeyAutomatically:当文字输入长度为0,失能键盘的return,但文字输入长度大于0,使能键盘的return
⑧、secureTextEntry:密码输入,输完一段时间、或输入下一个字体,会变成*
⑨、textContentType:把自己的通讯录内容,变成键盘上的一个ToolBar按钮,快速填入。第三方键盘好像不支持。
1-4-3)、点击跳转到新页面
①、设置代理
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ SearchVC *vc = [[SearchVC alloc]init]; [self.navigationController pushViewController:vc animated:YES]; return NO; } // 同 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
②、跳转过去,跳出键盘
-(void)viewWillAppear:(BOOL)animated{ [self.searchTF becomeFirstResponder]; }
2、字体计算、自适应
1)、固定的Frame,自适应Font大小,如数量增减,1和1000。
[label1 setAdjustsFontSizeToFitWidth:YES];
2)、固定的Font,自适应Frame,用于信息类显示
[label2 sizeToFit];
3)、固定的Font,获取自适应Frame值,反过来设置Label的Frame,用于信息类显示。这里的100是等下设置Label的width,也是返回的rect.frame.size.width
CGRect rect = [templabel.text boundingRectWithSize:CGSizeMake(100, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:templabel.font} context:nil];
后续补充:
"3)" 有误,100为限制的最大宽度,但是,如果不足100,还是会返回正确的值。不是都返回100。
"1)"、"2)" ,自适应尺寸的,要记得设置size。没有边界如何自适应。(因为一般在约束Lable,都没约束size,故特意写下)
3、键盘相关
0)、键盘强制显示、隐藏
// 成为第一响应(弹起) [self.tfView becomeFirstResponder]; // 取消第一响应(隐藏) [self.tfView resignFirstResponder];
1)、键盘事件通知
1-1)、弹出键盘可能盖住TextField。监听键盘的通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoradChangeAction:) name:UIKeyboardWillChangeFrameNotification object:nil];
1-2)、keyBoradChangeAction方法里接收通知,duration是键盘动画时间,keyBoardNewY是键盘当前的y轴位置,keyBoardOldY主要和当前键盘位置比较。(接着要移动评论框或者移动后面的ScrollView都可以)
- (void)keyBoradChangeAction:(NSNotification*)noti { CGFloat duration = [[noti.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; CGFloat keyBoardOldY = [[noti.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey]CGRectValue].origin.y; CGFloat keyBoardNewY = [[noti.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].origin.y; //1、通过重置约束条件 //1-1-1)、xib拉过来 或 原生约束 //self.theBottomSpace.constant = ?; //1-1-2)、Masonry约束make返回的值 //theBottomWidth.mas_equalTo(); //1-1-3)、Masonry代码更新约束 //self.theBottomview mas_updateConstraints [UIView animateWithDuration:duration animations:^{ //1-2)、更新约束( 在1-1-1 或 1-1-2 或 1-1-3 的基础上跟新约束 ) //[self.view layoutIfNeeded]; //2、通过改变Frame if ( (int)(keyBoardOldY - keyBoardNewY) > 0 ) { [self showKeyBoardModelWithY:keyBoardNewY]; } else { [self showNomalModel]; } }]; }
2)、dealloc记得移除
[[NSNotificationCenter defaultCenter]removeObserver:self];
3)、touchesBegan:withEvent && scrollViewDidScroll -->屏幕点击&&屏幕滑动要取消编辑状态
//不建议,有的View有偏移量的,会有问题。 //[self.view endEditing:YES]; //谁监听的,让谁去放弃第一响应 [self.tfView resignFirstResponder];
后续补充:如有用IQKeyboard ,需要关闭
- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // 如果是view,可以加在init [[IQKeyboardManager sharedManager] setEnable:NO]; } -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; // 如果是view,可以加在dealloc [[IQKeyboardManager sharedManager] setEnable:YES]; }
后续补充:现在有出现一种情况,就是cell有响应点击事件,而又想通过点击其他地方取消键盘,结果却进入了cell的点击事件里。
解决方法:1、可考虑加个透明、有手势识别的View ?
2、跳转到新的输入页面。绝大部分APP的做法,同时还能多显示,输入记录等信息!