美文网首页iOS学习笔记iOS点点滴滴iOS程序猿
iOS\Mac OS 根据字体大小、控件宽度,计算字符串展示时尺

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

作者: goyohol | 来源:发表于2021-05-12 20:19 被阅读0次


    - (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

    相关文章

      网友评论

        本文标题:iOS\Mac OS 根据字体大小、控件宽度,计算字符串展示时尺

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