查看: 3310|回复: 0

[IOS开发教程] iOS:文字相关(18-01-24更)

发表于 2018-3-4 17:45:39

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、多行

1、小技巧:

  UILabel类:

    1-1-1)、设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效)。

  1. // 最后面的,以"..."结束
  2. self.contentLabel.lineBreakMode = NSLineBreakByTruncatingTail;
复制代码

  UITextField类:

    1-2-1)、清空按钮。

  1. // 当编辑时才出现
  2. self.inputTF.clearButtonMode = UITextFieldViewModeWhileEditing;
复制代码

  UITextView类:

    1-3-1)、UITextView只能x轴居中,y轴需要手动调

        --修改自简书 《IOS UITextView内容垂直居中方法》 --木头Lee

  1. - (void)contentSizeToFit
  2. {
  3. //先判断一下有没有文字(没文字就没必要设置居中了)
  4. if([msgTextView.text length]>0)
  5. {
  6. //textView的contentSize属性
  7. CGSize contentSize = msgTextView.contentSize;
  8. //textView的内边距属性
  9. UIEdgeInsets offset;
  10. //如果文字内容高度没有超过textView的高度
  11. if(contentSize.height <= msgTextView.height)
  12. {
  13. //textView的高度减去文字高度除以2就是Y方向的偏移量,也就是textView的上内边距
  14. CGFloat offsetY = (msgTextView.height - contentSize.height)/2;
  15. offset = UIEdgeInsetsMake(offsetY, 0, 0, 0);
  16. }
  17. //根据前面计算设置textView的ContentSize和Y方向偏移量
  18. [msgTextView setContentInset:offset];
  19. }
  20. }
复制代码

  UITextField、UITextView类共有:

    1-4-1)、在键盘上面显示一个右边有“完成”按钮的ToolBar。

  1. UIToolbar *numberToolBar= [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, kSCREEN_WIDTH, 40)];
  2. numberToolBar.items = [NSArray arrayWithObjects:
  3. [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
  4. [[UIBarButtonItem alloc]initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],
  5. nil];
  6. //numberToolBar.tintColor=[UIColor redColor];
  7. self.inputTF.inputAccessoryView = numberToolBar;
  8. - (void)doneWithNumberPad
  9. {
  10. }
复制代码

    1-4-2)、协议 UITextInputTraits(自动大写、纠错、键盘相关):

      ①、autocapitalizationType:自动首字母大写

      ②、autocorrectionType:自动纠错

      ③、spellCheckingType:拼写检查

      ④、keyboardType:键盘类型

      ⑤、keyboardAppearance:键盘颜色样式

      ⑥、returnKeyType:返回的按键“字”:发送、下一个...

      ⑦、enablesReturnKeyAutomatically:当文字输入长度为0,失能键盘的return,但文字输入长度大于0,使能键盘的return

      ⑧、secureTextEntry:密码输入,输完一段时间、或输入下一个字体,会变成*

      ⑨、textContentType:把自己的通讯录内容,变成键盘上的一个ToolBar按钮,快速填入。第三方键盘好像不支持。

    1-4-3)、点击跳转到新页面

      ①、设置代理

  1. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
  2. SearchVC *vc = [[SearchVC alloc]init];
  3. [self.navigationController pushViewController:vc animated:YES];
  4. return NO;
  5. }
  6. // 同
  7. - (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
复制代码

      ②、跳转过去,跳出键盘

  1. -(void)viewWillAppear:(BOOL)animated{
  2. [self.searchTF becomeFirstResponder];
  3. }
复制代码

  

2、字体计算、自适应

  1)、固定的Frame,自适应Font大小,如数量增减,1和1000。

  1. [label1 setAdjustsFontSizeToFitWidth:YES];
复制代码

  2)、固定的Font,自适应Frame,用于信息类显示

  1. [label2 sizeToFit];
复制代码

  3)、固定的Font,获取自适应Frame值,反过来设置Label的Frame,用于信息类显示。这里的100是等下设置Label的width,也是返回的rect.frame.size.width

  1. 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)、键盘强制显示、隐藏

  1. // 成为第一响应(弹起)
  2. [self.tfView becomeFirstResponder];
  3. // 取消第一响应(隐藏)
  4. [self.tfView resignFirstResponder];
复制代码

  1)、键盘事件通知

    1-1)、弹出键盘可能盖住TextField。监听键盘的通知

  1. [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoradChangeAction:) name:UIKeyboardWillChangeFrameNotification object:nil];
复制代码

    1-2)、keyBoradChangeAction方法里接收通知,duration是键盘动画时间,keyBoardNewY是键盘当前的y轴位置,keyBoardOldY主要和当前键盘位置比较。(接着要移动评论框或者移动后面的ScrollView都可以)

  1. - (void)keyBoradChangeAction:(NSNotification*)noti
  2. {
  3. CGFloat duration = [[noti.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
  4. CGFloat keyBoardOldY = [[noti.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey]CGRectValue].origin.y;
  5. CGFloat keyBoardNewY = [[noti.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].origin.y;
  6. //1、通过重置约束条件
  7. //1-1-1)、xib拉过来 或 原生约束
  8. //self.theBottomSpace.constant = ?;
  9. //1-1-2)、Masonry约束make返回的值
  10. //theBottomWidth.mas_equalTo();
  11. //1-1-3)、Masonry代码更新约束
  12. //self.theBottomview mas_updateConstraints
  13. [UIView animateWithDuration:duration animations:^{
  14. //1-2)、更新约束( 在1-1-1 或 1-1-2 或 1-1-3 的基础上跟新约束 )
  15. //[self.view layoutIfNeeded];
  16. //2、通过改变Frame
  17. if ( (int)(keyBoardOldY - keyBoardNewY) > 0 )
  18. {
  19. [self showKeyBoardModelWithY:keyBoardNewY];
  20. }
  21. else
  22. {
  23. [self showNomalModel];
  24. }
  25. }];
  26. }
复制代码

  2)、dealloc记得移除

  1. [[NSNotificationCenter defaultCenter]removeObserver:self];
复制代码

  3)、touchesBegan:withEvent && scrollViewDidScroll -->屏幕点击&&屏幕滑动要取消编辑状态

  1. //不建议,有的View有偏移量的,会有问题。
  2. //[self.view endEditing:YES];
  3. //谁监听的,让谁去放弃第一响应
  4. [self.tfView resignFirstResponder];
复制代码

  后续补充:如有用IQKeyboard ,需要关闭

  1. - (void)viewWillAppear:(BOOL)animated{
  2. [super viewWillAppear:animated];
  3. // 如果是view,可以加在init
  4. [[IQKeyboardManager sharedManager] setEnable:NO];
  5. }
  6. -(void)viewWillDisappear:(BOOL)animated{
  7. [super viewWillDisappear:animated];
  8. // 如果是view,可以加在dealloc
  9. [[IQKeyboardManager sharedManager] setEnable:YES];
  10. }
复制代码

  后续补充:现在有出现一种情况,就是cell有响应点击事件,而又想通过点击其他地方取消键盘,结果却进入了cell的点击事件里。

       解决方法:1、可考虑加个透明、有手势识别的View ?

            2、跳转到新的输入页面。绝大部分APP的做法,同时还能多显示,输入记录等信息!

  

  



回复

使用道具 举报