美文网首页开发笔记
关于动态获取字符串宽度和高度的一点内容

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

作者: 浅痕v淡去 | 来源:发表于2017-02-09 10:45 被阅读0次

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

    相关文章

      网友评论

        本文标题:关于动态获取字符串宽度和高度的一点内容

        本文链接:https://www.haomeiwen.com/subject/hcliittx.html