欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS:文字相关(18-01-24更)

程序员文章站 2022-07-02 17:10:18
0、写在前面 1、小技巧 UILabel类: 1-1-1)、设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效)。 UITextField类: 1-2-1)、清空按钮。 UITextView类: 1-3-1)、UITextView只能x轴居中,y轴需要手动调。 UITextFi ......

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)、设置行间距富文本,有省略号要求的,需要再次设置省略(初始化时设置的会失效)。

// 最后面的,以"..."结束
self.contentLabel.lineBreakMode = NSLineBreakByTruncatingTail;

 

  UITextField类:

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

// 当编辑时才出现
self.inputTF.clearButtonMode = UITextFieldViewModeWhileEditing;

 

  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的做法,同时还能多显示,输入记录等信息!