iOS\Mac OS 根据字体大小、控件宽度,计算字符串展示时尺寸!


- (NSRect)boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attributes context:(nullable NSStringDrawingContext *)context API_AVAILABLE(macos(10.11), ios(7.0), watchos(2.0), tvos(9.0));
均通过此方法进行尺寸计算!

封装成一个类别:“NSObject+CalculateTextSize”!



iOS端

使用UILabel时,设置当前的高度不能显示完文字!

CGFloat w = 200;
CGFloat h = 50;
UILabel * lb = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, w, h)];
[self.view addSubview:lb];
lb.backgroundColor = [UIColor cyanColor];
lb.numberOfLines = 0;
lb.lineBreakMode = NSLineBreakByCharWrapping;
lb.text = @"阿达的减肥了克里斯qwertyyuiopasdfghjklzxcvbnm,.;/'[]\1234455678890";//显示不完的字符串

效果:当前的高度不能显示完文字!


书写一个类别“NSObject+CalculateTextSize”:
“.h”文件:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> //添加UIKit头文件,支持NSFontAttributeName、NSStringDrawingUsesLineFragmentOrigin/NSStringDrawingUsesFontLeading等属性

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (CalculateTextSize)

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param font 字体
 @return 文字实际所占的尺寸
 */
- (CGSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFont:(UIFont *)font;

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param fontSize 字体大小(数字)
 @return 文字实际所占的尺寸
 */
- (CGSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFondSize:(int)fontSize;

@end

NS_ASSUME_NONNULL_END

“.m”文件:

#import "NSObject+CalculateTextSize.h"

@implementation NSObject (CalculateTextSize)

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param font 字体
 @return 文字实际所占的尺寸
 */
- (CGSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFont:(UIFont *)font {
    // 把该属性放到字典中
    NSDictionary *dictAttr = [[NSDictionary alloc] initWithObjectsAndKeys:font,NSFontAttributeName, nil];
    // 通过字符串的计算文字所占尺寸方法获取尺寸
    CGSize size = [strContent boundingRectWithSize:CGSizeMake(w, 0) //文本的Label的尺寸
                                           options: NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading //文本绘制时的附加选项
                                        attributes:dictAttr //文字的属性
                                           context:nil].size;
    return size;
}

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param fontSize 字体大小(数字)
 @return 文字实际所占的尺寸
 */
- (CGSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFondSize:(int)fontSize{
    // 先获取文字的属性,特别是影响文字所占尺寸相关的
    UIFont *font = [UIFont systemFontOfSize:fontSize];
    // 把该属性放到字典中
    NSDictionary *dictAttr = [[NSDictionary alloc] initWithObjectsAndKeys:font,NSFontAttributeName, nil];
    // 通过字符串的计算文字所占尺寸方法获取尺寸
    CGSize size = [strContent boundingRectWithSize:CGSizeMake(w, 0) //文本的Label的尺寸
                                           options: NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading //文本绘制时的附加选项
                                        attributes:dictAttr //文字的属性
                                           context:nil].size;
    
    return size;
}

@end


使用:添加如下代码

CGFloat maxWidth = CGRectGetWidth(lb.frame) - 5;//用于计算的最大宽度 要稍小一点!
CGSize size = [self sizeForLblContent:lb.text fixMaxWidth:maxWidth andFont:lb.font];//计算到相应尺寸!
if (size.height > CGRectGetHeight(lb.frame)) {//高度超过范围
    CGRect newFrame = lb.frame;
    newFrame.size.height = size.height;//设置为新的height
    lb.frame = newFrame;
}

效果:重新设置的高度可以显示完文字!




Mac OS端

使用NSTextField时,设置当前的高度不能显示完文字!

NSTextField * showLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(100.0, 100.0, 200.0, 20.0)];//文字提示Label
[self.view addSubview:showLabel];
showLabel.bordered = NO;
showLabel.editable = NO; showLabel.enabled = NO;//不可操作,当作Label!
showLabel.lineBreakMode = NSLineBreakByCharWrapping;//换行模式:字符边界
showLabel.alignment = NSTextAlignmentCenter; //字体 居中
showLabel.backgroundColor = [NSColor redColor];
showLabel.textColor = [NSColor blackColor];      //textColor(字体色)
showLabel.stringValue = @"qwertyuiopasdfghjklzxcvbnm,./;'[]1234567890-=!@#$^&(*)QWWRRA";

效果:当前的高度不能显示完文字!


书写一个类别“NSObject+CalculateTextSize”:
“.h”文件:

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h> //添加Cocoa头文件,支持NSFontAttributeName、NSStringDrawingUsesLineFragmentOrigin/NSStringDrawingUsesFontLeading等属性

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (CalculateTextSize)

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param font 字体
 @return 文字实际所占的尺寸
 */
- (NSSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFont:(NSFont *)font;

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param fontSize 字体大小(数字)
 @return 文字实际所占的尺寸
 */
- (NSSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFondSize:(int)fontSize;


@end

NS_ASSUME_NONNULL_END

“.m”文件:

#import "NSObject+CalculateTextSize.h"

@implementation NSObject (CalculateTextSize)

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param font 字体
 @return 文字实际所占的尺寸
 */
- (NSSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFont:(NSFont *)font {
    // 把该属性放到字典中
    NSDictionary *dictAttr = [[NSDictionary alloc] initWithObjectsAndKeys:font,NSFontAttributeName, nil];
    // 通过字符串的计算文字所占尺寸方法获取尺寸
    NSSize size = [strContent boundingRectWithSize:NSMakeSize(w, 0) //文本的Label的尺寸
                                           options: NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading //文本绘制时的附加选项
                                        attributes:dictAttr //文字的属性
                                           context:nil].size;
    return size;
}

/**
 计算 文字实际所占的尺寸
 
 @param strContent 字符串内容
 @param w 最大宽度
 @param fontSize 字体大小(数字)
 @return 文字实际所占的尺寸
 */
- (CGSize)sizeForLblContent:(NSString *)strContent fixMaxWidth:(CGFloat)w andFondSize:(int)fontSize{
    // 先获取文字的属性,特别是影响文字所占尺寸相关的
    NSFont *font = [NSFont systemFontOfSize:fontSize];
    // 把该属性放到字典中
    NSDictionary *dictAttr = [[NSDictionary alloc] initWithObjectsAndKeys:font,NSFontAttributeName, nil];
    // 通过字符串的计算文字所占尺寸方法获取尺寸
    NSSize size = [strContent boundingRectWithSize:NSMakeSize(w, 0) //文本的Label的尺寸
                                           options: NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading //文本绘制时的附加选项
                                        attributes:dictAttr //文字的属性
                                           context:nil].size;
    
    return size;
}

@end


使用:添加如下代码

CGFloat maxWidth = showLabel.frame.size.width - 5;//用于计算的最大宽度 要稍小一点!
NSSize size = [self sizeForLblContent:showLabel.stringValue fixMaxWidth:maxWidth andFont:showLabel.font];//计算到相应尺寸!
if (size.height > showLabel.frame.size.height) {//高度超过范围
    NSRect newFrame = showLabel.frame;
    newFrame.size.height = size.height;//设置为新的height
    showLabel.frame = newFrame;
}

效果:重新设置的高度可以显示完文字!



思路如此,封装看个人~








goyohol's essay

推荐阅读更多精彩内容