美文网首页技术重塑
TextField,我还是不了解你~…~ placeholde

TextField,我还是不了解你~…~ placeholde

作者: PPAbner | 来源:发表于2017-04-12 18:07 被阅读220次

UITextField PPTextField **2017-04-12 **

我的志愿是做一个校长,每天收集了学生的学费之后就去吃火锅,今天吃麻辣火锅,明天吃酸菜鱼火锅,后天吃猪骨头火锅。
——《麦兜的理想》

一直以来,我都想弄个好用的输入框,加油ing...

placeholder垂直居中,先看效果图:

font = 18 font = 12 font = 6

思路供上

  1. 自定义PPCustomTextField,重写- (CGRect)placeholderRectForBounds:(CGRect)bounds;
  2. 判断是否有attributedPlaceholder,有attributedPlaceholder后,placeholder就废了;

2.1 获取attributedPlaceholder对应的Font,(调用- (void)enumerateAttribute: inRange: options: usingBlock:,拿到font对应的fontName和fontSize,生成Font);

  1. 分别获取tf文字的高度和placeholder文字的高度;

  2. 处理3中两者的差值,设置为placeholderY值。

最开始测试,一直失败,效果图一直如下:

最开始的失败结果

细细观察,会发现占位符不区分中英文算长度光标是上对齐的,并不是居中,无论我怎么设置- (CGRect)placeholderRectForBounds:(CGRect)bounds的返回值,都这样,直到我把Y值设为3居中了居中了居中了。。。,可是为什么呢怎么回事

原来,placeholder居中,跟光标有关系(相对于光标的frame),而光标也就是tf.text尺寸!

接下来,思路就清晰了:**计算出文字的高,在计算出placeholder的高,相减【X不变,width不变,height不变,只需要重置Y值就好】
**

多说一句,【个人猜测】系统会处理placeholder的width和height不会超过 tf.text的边界。

然后就代码撸起来:

如果不想看下面代码,可下载示例demo跑起来,indexPath.row == 2的那个

- (CGRect)placeholderRectForBounds:(CGRect)bounds
{
    CGFloat x = CGRectGetMinX(bounds);
    CGFloat width = CGRectGetWidth(bounds);
    CGFloat height = CGRectGetHeight(bounds);
    
    UIFont *textFont;
    if (self.placeholder.length > 0) {
        textFont = self.font;
    }
    
    //说明:有attributedPlaceholder后,placeholder就废了
    __block NSString *fontNameStr = @"";
    __block CGFloat fontSize = 0;
    if (self.attributedPlaceholder.length > 0) {
        if (self.placeholderHeight <= 0) {  //没有计算过它的高度
            [self.attributedPlaceholder enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, self.attributedPlaceholder.length) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {
                UIFont *font = (UIFont *)value;
                NSString *tempFontNameStr = font.fontDescriptor.postscriptName;
                CGFloat tempFontSize = font.fontDescriptor.pointSize;
                if (tempFontSize >= fontSize) {
                    fontSize = tempFontSize;
                    fontNameStr = tempFontNameStr;
                }
            }];
            
#warning pp605 此处怎么获取当前的字体名,这样再设置是最严谨的
#warning pp605 此处怎么获取当前的字体名,这样再设置是最严谨的
#warning pp605 此处怎么获取当前的字体名,这样再设置是最严谨的
            //粗体
            if ([fontNameStr isEqualToString:@".SFUIDisplay-Semibold"]) {
                textFont = [UIFont boldSystemFontOfSize:fontSize];
            }
            //默认
            else{
                textFont = [UIFont systemFontOfSize:fontSize];
            }
            
        }
    }
    
    if (self.textHeight <= 0) {
        self.textHeight = [self getHeightWithFont:self.font];
    }
  
    if (self.placeholderHeight <= 0) {
        self.placeholderHeight = [self getHeightWithFont:textFont];
    }
    
    CGFloat placeholderY = 0;
    if (self.textHeight-self.placeholderHeight > 0) {
        placeholderY = (self.textHeight-self.placeholderHeight)/2;
    }
    NSLog(@"高度分别是 %f---%f---%f",self.textHeight,self.placeholderHeight,self.textHeight-self.placeholderHeight);

    return CGRectMake(x, placeholderY, width, height);
    
    

}

-(CGFloat)getHeightWithFont:(UIFont *)font
{
    NSString *strq = @"";
    CGSize size = [strq boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
    return size.height;
}


相关文章

网友评论

  • 马爷:有没有遇到过 textField 输入的时候 光标下移或者说是文字下移的问题
    5d47cda490f0:我遇到过一次文字光标下移的问题。我出现那样问题的原因是我的textField用的xib拖出来的,在xib里直接设置的无边框。解决方法是用代码设置textField无边框,不用xib的设置就OK了。
    马爷:@PPAbner 没有设置高度 是默认的高度 还是不知道为什么会这样
    PPAbner:@马爷 你不要把textfield的高设置太高,你用系统自己的视图层看看,然后调试下!!!

本文标题:TextField,我还是不了解你~…~ placeholde

本文链接:https://www.haomeiwen.com/subject/okwmattx.html