Swift:Lable 高度计算误差

2020-10-27 14:48:14 浏览数 (1)

项目中,发现同样的代码,在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中的准确高度了

0 人点赞