UITextField的placeholder没有垂直居中

最近小编在项目中遇到了一个问题,就是当textFieldtextFontplaceholderfont相差较大时,placeholder的位置竟然偏移了,没有垂直居中
原来的代码

    UITextField *textField = [[UITextField alloc]init];
    textField.delegate = self;
    textField.backgroundColor = [UIColor orangeColor];
    textField.font = [UIFont systemFontOfSize:25];
    textField.textColor = [UIColor redColor];
    textField.textAlignment = NSTextAlignmentLeft;
    
    NSString *text = @"可提现金额300元";
    
    NSMutableAttributedString *titleStr = [[NSMutableAttributedString alloc]initWithString:text];
    
    [titleStr addAttributes:@{NSFontAttributeName:kFont(10)} range:NSMakeRange(0, titleStr.length)];
    
    textField.attributedPlaceholder = titleStr;
    
    [self.view addSubview:textField];

UITextField的placeholder没有垂直居中_第1张图片
原来的placeholder效果图.jpg

原来的text的效果图.jpg

怎么办?就这样的效果ui妹子非要把我祭天不可,没办法,只有赶快弄清楚为什么会出现这个问题,然后才能根据原理去修复这个bug。
根据上网查资料才得知问题所在:

placeholderUITextField的位置是以输入文字光标的上端点作为它的显示位置,所以当我们设置的placeholder字体大小与textField设置的输入文字大小差别很大时,placeholder的显示位置就不会垂直居中而发生偏移。

解决方法:
小编经过多次尝试之后发现都不行,最后看到了NSMutableParagraphStyle,我决定使用这个再试试

    // 段落样式
    NSMutableParagraphStyle *style = [textField.defaultTextAttributes[NSParagraphStyleAttributeName] mutableCopy];
    
    // minimumLineHeight 最小行高 改变placeholder的最小行高
    style.minimumLineHeight = textField.font.lineHeight - (textField.font.lineHeight - kFont(10).lineHeight)/2.0;
    
    style.lineSpacing = 10; // 字体的行间距
    
    style.firstLineHeadIndent = 15.f; //首行缩进
    
    NSString *text = @"可提现金额300元";
    
    NSMutableAttributedString *titleStr = [[NSMutableAttributedString alloc]initWithString:text];
    
    [titleStr addAttributes:@{NSFontAttributeName:kFont(10), NSParagraphStyleAttributeName:style} range:NSMakeRange(0, titleStr.length)];
    
    textField.attributedPlaceholder = titleStr;
    
    [self.view addSubview:textField];

最后的效果图:


没有设置首行缩进

设置了首行缩进

输入了文字之后

好了,问题解决了,怕以后再次遇到,就记录一下吧,顺便帮那些遇到这个问题的提供个思路吧~~吼吼

你可能感兴趣的:(UITextField的placeholder没有垂直居中)