动态获取字符串宽度和高度在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: 限定宽度