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

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

作者头像
GuangdongQi
发布于 2018-05-24 09:49:12
发布于 2018-05-24 09:49:12
5.3K00
代码可运行
举报
文章被收录于专栏:Guangdong QiGuangdong Qi
运行总次数:0
代码可运行

开篇

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

计算NSString宽高

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//返回字符串所占用的尺寸.
- (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
代码运行次数:0
运行
AI代码解释
复制
CGSizeMake(200 , CGFLOAT_MAX)
计算NSAttributedString宽高

先查看系统API

Paste_Image.png

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (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
代码运行次数:0
运行
AI代码解释
复制
//调整行间距
+ (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
代码运行次数:0
运行
AI代码解释
复制
+ (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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(转)iOS学习——UIlabel设置行间距和字间距
  在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节。
mukekeheart
2019/01/07
4.1K0
UI篇-CATextLayer和 富文本的交融
CATextLayer适用于IOS或者MAC,比UIlablel 和 NSTextView 能做的事很多,可以这样说UIlablel是通过CATextLayer实现的,身为CALayer的三大子类之一,它的功能远比 UIlablel 强大的多的多,其最主要的特点是CATextLayer可以被NSMutableAttributedString直接附值。而NSMutableAttributedString有可以最自己内容作出颜色以及大小的调整,这样结合起来使用的话,就远比UILabel 灵活的多,效果也酷炫的多,也许CATextLayer就是为了NSMutableAttributedString而生的,(哈哈,开个玩笑)。下面就简要介绍下CATextLayer 的常规使用,不足之处,还望朋友们下面留言补充,不胜感谢。 苹果官网给出CATextLayer的API解释
進无尽
2018/09/12
2.8K0
UI篇-CATextLayer和 富文本的交融
html图片自适应div大小_未知宽高的div元素垂直水平居中
2.设置html图片的高度 计算出来的 height 正好是排版后的高度大小,是 CGFloat 类型,在是在我们设置UIlabel/Cell 高度时,可能存在四舍五入等,最后存在的一点点误差使得 UILabel 显示不全,可能出现缺少一行,上下空白太多等情况;
全栈程序员站长
2022/11/09
3.2K0
iOS小结
上传图片 图片发自简书App gif图片的显示 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"railway" of
且行且珍惜_iOS
2018/05/22
6040
Swift:Lable 高度计算误差
项目中,发现同样的代码,在swift里面计算出来的高度是有误差的 但是用oc确没这个问题 #import "PHString.h" @implementation PHString /// 获取字符串size /// @param string 字符串 /// @param lineSpacing 行数 /// @param fontSize 字符串字号 /// @param rectSize 给一个固定的宽或者高 + (CGSize)getStringRectWith:(NSString *)stri
菜菜不吃蔡
2020/10/27
1.1K0
iOS文本尺寸自适应异步计算实现
目前市面上的非UI线程文本算高方法或多或少都有一些问题。本文通过逆向和分析UILabel的sizeThatFits方法实现来得到一个最佳的文本算高的精简方法。方法可以运行在任意线程,因此可以有效的应用在那些异步算高或者要求尺寸进行提前计算的场景中。
欧阳大哥2013
2020/07/24
1.6K0
富文本AttributedString的总结
AttributedString可以分为NSAttributedString和NSMutableAttributedString两种。 在使用中通过将AttributedString赋值给控件的 attributedText 属性来添加文字样式。 可设置的控件有UILabel、UITextField和UITextView。
码客说
2019/10/22
3.6K0
iOS 之-富文本 (NSAttributedString)
关于富文本能做什么我就不多说了,我们一般遇到的图文混排等,这个还是很好做到的。 好,开讲了: 在讲之前,我们得先明白他的属性和一些方法 1.属性: NSFontAttributeName 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 NSForegroundColorAttributeNam 设置字体颜色,取值为 UIColor对象,默认值为黑色 NSBackgroundColorAttributeName
清墨
2018/05/07
3.1K0
iOS 之-富文本 (NSAttributedString)
IOS label 设置行高
使用NSMutableAttributedString 设置之后,你会发现多行文本的省略号...没有了,为了解决此问题,解决方案如下:
用户1219438
2020/08/11
1.3K0
IOS label 设置行高
设置UILabel的行间距
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53262085
用户1451823
2018/09/13
1.4K0
iOS开发——实用性技巧
分享一些项目中常用的方法,可以保存起来,作为自己的工具集哦。 1.磁盘总空间大小 + (CGFloat)diskOfAllSizeMBytes { CGFloat size = 0.0; NSError *error; NSDictionary *dic = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error]; if (error) { #
Originalee
2018/08/30
6550
【API使用系列】Core Text专题
https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html
江中散人_Jun
2022/03/08
9180
【API使用系列】Core Text专题
iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度
关于boundingRectWithSize,系统API有几个类的相关方法。搜索官方文档,可见如下:
陈满iOS
2018/09/10
5.6K0
iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度
[iOS] 小问题记录
iOS 往数据库里写保存文件路径的时候,不要写全路径,因为软件更新或者重新安装沙盒路径会变
wOw
2018/09/18
3.5K0
ios开发中解决UILabel上文字不能右对齐的问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/80591908
用户1451823
2018/09/13
2.2K0
ios开发中解决UILabel上文字不能右对齐的问题
在iOS中如何正确的实现行间距与行高
最近准备给 VirtualView-iOS 的文本元素新增一个 lineHeight 属性,以便和 VirtualView-Android 配合时能更精确的保证双平台的一致性。面向 Google 以及 Stack Overflow 编程了一会后发现,能查到的资料大部分是介绍如何实现 lineSpacing 属性,而不是 lineHeight。但是我就是因为 iOS 和 Android 的默认 lineSpacing 不一致所以才想实现个 lineHeight 啊!还是需要自己动手丰衣足食,顺带整理成文章造福后人。
用户1219438
2018/12/26
4.7K0
实践-腾讯新闻图文详情实现
前言 实现了一个类似腾讯新闻图文详情页的效果,不多说,上效果图 新闻.gif 草图 Paste_Image.png 步骤 创建一个 ScorllView 里面放上图片,可以左右滑动。 创建一个 UIT
進无尽
2018/09/12
8260
实践-腾讯新闻图文详情实现
底牌项目中设置论坛中各个模块头图的代码
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/54906641
用户1451823
2018/09/13
6000
【IOS开发基础系列】UITextView专题
frame.size.height = self.serTextView.contentSize.height;
江中散人_Jun
2023/10/16
5230
【IOS开发基础系列】UITextView专题
iOS开发 UIlabel 文字两边对齐
1、给UIlabel添加一个分类即可,代码如下: 必须导入这个头文件:CoreText/CoreText.h - (void)changeAlignmentRightandLeft{ CGRect textSize = [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTr
czjwarrior
2018/05/28
2.1K0
推荐阅读
相关推荐
(转)iOS学习——UIlabel设置行间距和字间距
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验