前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 计算NSString宽高与计算NSAttributedString的宽高

iOS 计算NSString宽高与计算NSAttributedString的宽高

作者头像
GuangdongQi
发布2018-05-24 17:49:12
4.8K0
发布2018-05-24 17:49:12
举报
文章被收录于专栏:Guangdong QiGuangdong Qi

开篇

项目有一个客服反馈功能,用到的是聊天列表的形式,这就免不了计算字符串的宽高,由于要给字符串加间距,没办法,只能用 NSAttributedString 所以要计算NSAttributedString的长宽

计算NSString宽高

计算NSString宽高很简单,代码如下:

代码语言:javascript
复制
//返回字符串所占用的尺寸.
- (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize
{
    NSDictionary *attrs = @{NSFontAttributeName : font};
    return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
参数解读

font 是当前字符串的字体(包含大小信息) maxSize 是一个最大的距离:如我最大的宽度只让他为200,高度不限,则传入:

代码语言:javascript
复制
CGSizeMake(200 , CGFLOAT_MAX)
计算NSAttributedString宽高

先查看系统API:

Paste_Image.png

代码如下:

代码语言:javascript
复制
- (CGRect)boundsWithFontSize:(CGFloat)fontSize text:(NSString *)text needWidth:(CGFloat)needWidth lineSpacing:(CGFloat )lineSpacing
{
    
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
    
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    
    style.lineSpacing = lineSpacing;
    
    UIFont *font = Font_Light(fontSize);
    
    [attributeString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)];
    
    [attributeString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, text.length)];
    
    NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
    
    CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(needWidth, CGFLOAT_MAX) options:options context:nil];
    
    
    
    return rect;
    
}
参数解读

fontSize :是当前字符串的字体(包含大小信息) text:将要计算的�字符串 needWidth:将要计算的最大宽度 lineSpacing:行间距大小

当然关于 NSAttributedString 的设置还有很多,不一一列举了,提供一个同事封装好的留下以后用

调整行间距
代码语言:javascript
复制
//调整行间距
+ (NSMutableAttributedString *)atttibutedStringForString:(NSString *)string LineSpace:(CGFloat)lineSpace {

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpace];
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [string length])];

    return attributedString;
  
}
设置属性文字
代码语言:javascript
复制
+ (NSMutableAttributedString *)attributedStringForString:(NSString *)string attributeds:(NSDictionary *)attributeds hasPrefix:(NSString *)hasPrefix  hasSuffix:(NSString *)hasSuffix {


    if (string.length == 0) {

        return nil;
    }

    if (hasSuffix.length ==0) {

        hasSuffix = @"";
    }

    if (hasPrefix.length == 0) {
        hasPrefix = @"";

    }

    NSString *str = [NSString stringWithFormat:@"%@%@%@",hasPrefix,string,hasSuffix];

    NSRange range = [str rangeOfString:string];
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:str];

    [attributedString addAttributes:attributeds range:range];


    if ([attributeds objectForKey:@"NSParagraphStyle"]) {

        NSMutableParagraphStyle * paragraphStyle = [attributeds objectForKey:@"NSParagraphStyle"];

        [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];

    }

    
    return attributedString;
    
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开篇
    • 计算NSString宽高
      • 计算NSAttributedString宽高
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档