六.UITextView 计算行数
PS:有时我们需要对textView的行高进行判断,从而做一些操作.
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">CGSize size = [textView.text sizeWithAttributes:@{your font} constrainedToSize:textViewSize];
UIFont *font = your font; //NSFontAttributeName:[UIFontsystemFontOfSize:17]
NSInteger lines = (NSInteger)(size.height / font.lineHeight);</span>
七.获取UITextView的自定义高度
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">方法一:ios7.0之前适用
- (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width
{
CGSize sizeToFit = [value sizeWithFont:[UIFont systemFontOfSize:fontSize]
constrainedToSize:CGSizeMake(width -16.0, CGFLOAT_MAX)
lineBreakMode:NSLineBreakByWordWrapping];
//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
returnsizeToFit.height + 16.0;
}</span>
参数的含义:
@method 获取指定宽度width,字体大小fontSize,字符串value的高度
@param value 待计算的字符串
@param fontSize 字体的大小
@param Width 限制字符串显示区域的宽度
@result float 返回的高度
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">方法二:ios7.0及之后适用
- (float) heightForString:(NSString *)value andWidth:(float)width{
//获取当前文本的属性
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:value];
_text.attributedText = attrStr;
NSRange range = NSMakeRange(0, attrStr.length);
// 获取该段attributedString的属性字典
NSDictionary *dic = [attrStr attributesAtIndex:0effectiveRange:&range];
// 计算文本的大小
CGSize sizeToFit = [value boundingRectWithSize:CGSizeMake(width - 16.0, MAXFLOAT) // 用于计算文本绘制时占据的矩形块
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本绘制时的附加选项
attributes:dic // 文字的属性
context:nil].size;// context上下文。包括一些信息,例如如何调整字间距以及缩放。该对象包含的信息将用于文本绘制。该参数可为nil
returnsizeToFit.height + 16.0;
}</span>
参数的含义:
@method 获取指定宽度width,字体大小fontSize,字符串value的高度
@param value 待计算的字符串
@param fontSize 字体的大小
@param Width 限制字符串显示区域的宽度
@result float 返回的高度
//注意:
第一,再前两种方法中,UITextView在上下左右分别有一个8px的padding,需要将UITextView.contentSize.width减去16像素(左右的padding 2 x 8px)。同时返回的高度中再加上16像素(上下的padding),这样得到的才是UITextView真正适应内容的高度。如代码中 CGSizeMake(width -16.0, CGFLOAT_MAX),return sizeToFit.height + 16.0。UILable中则不用
第二,options 参数请使用:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading设置两个枚举,不要设置一个
方法三:通用(推荐)
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">- (float) heightForString:(UITextView *)textView andWidth:(float)width{
CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, MAXFLOAT)];
returnsizeToFit.height;
}</span>
参数的含义:
@method 获取指定宽度width的字符串在UITextView上的高度
@param textView 待计算的UITextView
@param Width 限制字符串显示区域的宽度
@result float 返回的高度
八,设置textView的行间距
1.如果只是静态显示textView的内容为设置的行间距,执行如下代码:
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">// textview 改变字体的行间距
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 10;// 字体的行间距
NSDictionary *attributes = @{
NSFontAttributeName:[UIFont systemFontOfSize:15],
NSParagraphStyleAttributeName:paragraphStyle
};
textView.attributedText = [[NSAttributedString alloc] initWithString:@"输入你的内容" attributes:attributes];</span>
2.如果是想在输入内容的时候就按照设置的行间距进行动态改变,那就需要将上面代码放到textView的delegate方法里
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">-(void)textViewDidChange:(UITextView *)textView{
//textview 改变字体的行间距
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 20;// 字体的行间距
NSDictionary *attributes = @{ NSFontAttributeName:[UIFont systemFontOfSize:15],NSParagraphStyleAttributeName:paragraphStyle
};
textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:attributes];
}</span>
九.设置textView的placeholder
UITextView上如何加上类似于UITextField的placeholder呢,其实在UITextView上加上一个UILabel或者UITextView,如果用UILable的话,会出现一个问题就是当placeholder的文字过长导致换行的时候就会出现问题,而用UITextView则可以有效避免此问题。
<span style="font-family:FangSong_GB2312;font-size:12px;font-weight: normal;">- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{ if (![text isEqualToString:@""]) {
_placeholderLabel.hidden = YES;
}
if ([text isEqualToString:@""] && range.location == 0 && range.length == 1){
_placeholderLabel.hidden = NO;
}
return YES;
}</span>
说明如下:
(1) _placeholderLabel 是加在UITextView后面的UITextView,_placeholderLabel要保证和真正的输入框的设置一样,字体设置成浅灰色,然后 [_placeholderLabel setEditable:NO];真正的输入框要设置背景色透明,保证能看到底部的_placeholderLabel。
(2) [text isEqualToString:@""] 表示输入的是退格键
(3) range.location == 0 && range.length == 1 表示输入的是第一个字符