关于动态获取字符串宽度和高度的一点内容

动态获取字符串宽度和高度在UI搭建过程中是比较常用的知识点。在之前的工作过程中经常遇到的场景,一是在需要用到搜索页面的时候,需要提示一些热门标签,如简书App的搜索页面,本身热门标签的长度是不固定的,所以必须要动态判断字符串的宽度。关于动态获取字符串高度,比较常见的场景则是用于评论等交互场景,根据用户输入评论内容的不同,动态显示高度。

1.动态获取字符串高度。

先上代码,然后对几个重点参数进行以下分析:

func setUIViewHeight(_ title:String,size:CGFloat,width:CGFloat) -> CGFloat{
    let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]
    let size = title.boundingRect(with: CGSize(width: width, height: 10000000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size
    return size.height+30
}

这段代码是前段时间最新的一个项目:中国孔子网App里面的一段代码,主要应用在关于儒学经典的一些见解,还有评论框,实现的效果还是比较理想的。

 setUIViewHeight(_ title:String,size:CGFloat,width:CGFloat) -> CGFloat

函数的参数包含三个:第一个“title”参数,传入的是需要进行动态计算高度的字符串内容;第二个参数“size”,代表的是需要传入字符串的字号大小,不同的字号占用的宽度和高度是不同的,这点是非常显而易见的;第三个参数“width”,则是代表你所设定的加载字符串的控件的宽度。

let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]

本行代码是获取到通过传入的“size”参数,获取到系统字号,方便下面的代码使用。

let size = title.boundingRect(with: CGSize(width: width, height: 10000000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size

这一行代码才是重中之重,各种参数的准备工作工作都是为了本行代码而准备,其中比较难以理解的是“height: 10000000”,这里是设定一个可预测的值,即为需要加载字符串的控件可能达到的最大高度,一旦超出了这个值,空间的高度仍然是按照“height”后面设定的值来显示,因此,各位可以根据不同的需求来设定一个比较合适的值。

return size.height+30

最后的这行代码,因为需要在加载的时候,上下留有一定的空白区域,纯是为了美观,所以设定高度可以基本高度的基础上额外加一点。

几行简单的代码就实现了动态获取字符串高度。

2.动态获取字符串宽度。

还是先上代码,然后你就会发现,其实跟获取动态高度的代码如出一辙:

func setUIViewWidth(_ title:String,size:CGFloat) ->CGFloat{
    let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: size)]
    let size = title.boundingRect(with: CGSize(width: Swidth-16, height: 1000), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil).size
    return size.width+10
}

区别还是有一点的,比如下面:

setUIViewWidth(_ title:String,size:CGFloat) ->CGFloat

相对于获得高度,你无需去额外传入“height”参数,因为动态获取宽度,本身就是适用于较为简短的字符串,因此,基本不会因为控件高度问题影响到字符串宽度的显示,万一影响到了,那你应该考虑的就变成了如何动态获取高度了,不是吗?当然,为了严谨,添加“height”参数也是可以的,参照动态获取字符串高度即可。

记录一点开发过程中比较常用的资源,既能方便自己查阅,也希望能尽可能地帮助到跟我一样的朋友。

如果有什么需要补充的,请添加我的企鹅:591383605,互勉共进。

2017 - 10 - 25: 在网上新看到一个比较不错的动态获取高度的方法,补充一下:

// - 获取动态高度
func getLabelSize(text:String,fontSize:CGFloat,width:CGFloat)->CGFloat{
    let size = CGSize(width: width, height: 100000)
    let labelSize = sizeWith(text: text as NSString, maxSize: size, fontSize: 15)
    return labelSize.height
}

// - 计算文字的大小
func sizeWith(text:NSString,maxSize:CGSize,fontSize:CGFloat)->CGSize{
    //计算文本的大小
    let nameSize  = text.boundingRect(with: maxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: fontSize)], context: nil).size
    return nameSize
} 

调用

getLabelSize(text:String,fontSize:CGFloat,width:CGFloat)->CGFloat 

进行获取,其中参数含义为:
// - text: 文本内容
// - fontSize: 字体大小
// - width: 限定宽度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容