UITextField
PPTextField
**2017-04-12
**
我的志愿是做一个校长,每天收集了学生的学费之后就去吃火锅,今天吃麻辣火锅,明天吃酸菜鱼火锅,后天吃猪骨头火锅。
——《麦兜的理想》
一直以来,我都想弄个好用的输入框,加油ing...
placeholder垂直居中,先看效果图:
font = 18 font = 12 font = 6思路供上
- 自定义
PPCustomTextField
,重写- (CGRect)placeholderRectForBounds:(CGRect)bounds
;- 判断是否有
attributedPlaceholder
,有attributedPlaceholder
后,placeholder
就废了;2.1 获取
attributedPlaceholder
对应的Font,(调用- (void)enumerateAttribute: inRange: options: usingBlock:
,拿到font对应的fontName和fontSize,生成Font);
分别获取
tf
文字的高度和placeholder
文字的高度;处理3中两者的差值,设置为
placeholder
的Y值。
最开始测试,一直失败,效果图一直如下:
最开始的失败结果细细观察,会发现占位符不区分中英文算长度
和光标
是上对齐的,并不是居中,无论我怎么设置- (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;
}
网友评论