关于TextView的一些个人总结之二

六.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 表示输入的是第一个字符

你可能感兴趣的:(关于TextView的一些个人总结之二)