项目中,发现同样的代码,在swift里面计算出来的高度是有误差的
但是用oc确没这个问题
代码语言:javascript复制#import "PHString.h"
@implementation PHString
/// 获取字符串size
/// @param string 字符串
/// @param lineSpacing 行数
/// @param fontSize 字符串字号
/// @param rectSize 给一个固定的宽或者高
(CGSize)getStringRectWith:(NSString *)string
lineSpacing:(CGFloat)lineSpacing
fontSize:(CGFloat)fontSize
rectSize:(CGSize)rectSize {
UIFont *font = [UIFont systemFontOfSize: fontSize];
CGSize size = [self getStringRectWith:string lineSpacing:lineSpacing font:font rectSize:rectSize];
return size;
}
/// 获取字符串size
/// @param string 字符串
/// @param lineSpacing 行数
/// @param font 字符串字号
/// @param rectSize 给一个固定的宽或者高
(CGSize)getStringRectWith:(NSString *)string
lineSpacing:(CGFloat)lineSpacing
font:(UIFont *)font
rectSize:(CGSize)rectSize {
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString: string];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.lineSpacing = lineSpacing;
[attributeString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, string.length)];
[attributeString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, string.length)];
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(rectSize.width, rectSize.height) options:options context:nil];
NSLog(@"size:%@", NSStringFromCGSize(rect.size));
return rect.size;
}
@end
代码语言:javascript复制#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface PHString : NSObject
/// 获取字符串size
/// @param string 字符串
/// @param lineSpacing 行数
/// @param fontSize 字符串字号
/// @param rectSize 给一个固定的宽或者高
(CGSize)getStringRectWith:(NSString *)string
lineSpacing:(CGFloat)lineSpacing
fontSize:(CGFloat)fontSize
rectSize:(CGSize)rectSize;
/// 获取字符串size
/// @param string 字符串
/// @param lineSpacing 行数
/// @param font 字符串字号
/// @param rectSize 给一个固定的宽或者高
(CGSize)getStringRectWith:(NSString *)string
lineSpacing:(CGFloat)lineSpacing
font:(UIFont *)font
rectSize:(CGSize)rectSize;
@end
NS_ASSUME_NONNULL_END
swift中引用
代码语言:javascript复制 // MARK: 计算文字尺寸,可以处理计算带行间距的
/// 计算文字高度,可以处理计算带行间距的
/// - Parameters:
/// - rectString: 文字
/// - rectWidth: 文字限制宽度
/// - fontSize: 文字大小 -- 默认为不加粗
func getBoundingFontHeight(rectWidth: CGFloat = CGFloat(MAXFLOAT), font: UIFont, lineSpacing: CGFloat = 0) -> CGFloat {
if self.isEmpty {
return 0.0
}
let rectSize = CGSize(width: rectWidth, height: CGFloat(MAXFLOAT))
let size = PHString.getRectWith(self, lineSpacing: lineSpacing, font: font, rectSize: rectSize)
return size.height
}
这样就可以算出字符串在lable中的准确高度了