在Swift中我们计算文本的宽度和高度可以使用一下方式:
//.usesFontLeading 使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算
//.usesLineFragmentOrigin 整个文本将以每行组成的矩形为单位计算整个文本的尺寸
//.usesDeviceMetrics 将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围
//.truncatesLastVisibleLine 当文本不能适合的放进指定的边界之内,则自动在最后一行添加省略符号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效
/// 返回文本的高度
///
/// - Parameters:
/// - font: 字体
/// - width: 宽度
/// - Returns: 高度
func textHeight(font:UIFont,width:CGFloat)->CGFloat{
let height = self.boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions(rawValue: NSStringDrawingOptions.usesDeviceMetrics.rawValue | NSStringDrawingOptions.usesFontLeading.rawValue | NSStringDrawingOptions.usesLineFragmentOrigin.rawValue |
NSStringDrawingOptions.truncatesLastVisibleLine.rawValue
), attributes: [NSFontAttributeName:font], context: nil).size.height;
return height;
}
/// 返回文本的宽度
///
/// - Parameters:
/// - font: 字体
/// - height: 高度
/// - Returns: 宽度
func textWidth(font:UIFont,height:CGFloat)->CGFloat{
let width = self.boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: height), options: NSStringDrawingOptions(rawValue: NSStringDrawingOptions.usesFontLeading.rawValue | NSStringDrawingOptions.usesLineFragmentOrigin.rawValue |
NSStringDrawingOptions.truncatesLastVisibleLine.rawValue)
, attributes: [NSFontAttributeName:font], context: nil).size.width;
return width;
}
细心的同学们,肯定会发现在计算文本的宽度的时候,少了一个
NSStringDrawingOptions.usesDeviceMetrics.rawValue
在使用的时候,发现在计算高度的时候,没有什么问题。但是在计算文本的宽的时候,就会出现问题。只要在NSStringDrawingOptions有.usesDeviceMetrics 文本的宽度就会出现以下问题,其余的值单独使用或者一起使用,都没有这个问题。
self.view.addSubview(self.getCodeBtn);
let width = "获取验证码".textWidth(font: FONT(30), height: NEWHEIGHT(30));
self.getCodeBtn.snp.makeConstraints { (make) in
make.rightMargin.equalTo(-kRightMarin);
make.height.centerY.equalTo(self.codeTF);
make.width.equalTo(width);
}