首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

NSString+Size 计算一段文字的宽高

2024-12-21 来源:花图问答

流程思想是:
用一个字符串对象来调用此方法,传进的size一般可以设置最大宽度,中间需要传入一个属性字典来告知字体和样式,然后根据字符串长度的多少来算出应该给多大的frame,此方法一般写成分类便于调用。

#import  <UIKit/UIKit.h>
//采用分类的方法,方便在整个调用
@interface  NSString (Size)

//提供一个类的接口,方便在整个项目中调用

+ (CGSize)sizeWithString:(NSString*)str andFont:(UIFont*)font andMaxSize:(CGSize)size;

@end
#import"NSString+Size.h"
@implementation NSString (Size)
//用对象的方法计算文本的大小
- (CGSize)sizeWithFont:(UIFont*)font   andMaxSize:(CGSize)size {
       //特殊的格式要求都写在属性字典中
      NSDictionary*attrs =@{NSFontAttributeName: font};
      //返回一个矩形,大小等于文本绘制完占据的宽和高。
      return  [self  boundingRectWithSize:size  options:NSStringDrawingUsesLineFragmentOrigin  attributes:attrs   context:nil].size;
}

+ (CGSize)sizeWithString:(NSString*)str andFont:(UIFont*)font  andMaxSize:(CGSize)size{
      NSDictionary*attrs =@{NSFontAttributeName: font};
      return  [str boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs  context:nil].size;
}
@end
//测试代码
NSString*text =@"hdsfaajjkdlsakdsahdsjkjksdaljdkwos斯蒂芬妮圣诞快乐方能大量数据凯丰大厦浪费不带手机";
CGSize  textSize = [NSString   sizeWithString:text  andFont:[UIFont  systemFontOfSize:25]   andMaxSize:CGSizeMake(270,MAXFLOAT)];
NSLog(@"%@",NSStringFromCGSize(textSize));

现在常规的动态行高的计算方法还是用(iOS 7)

  • (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

参数

size

宽高限制,用于计算文本绘制时占据的矩形块。可以使用该方法计算文本绘制所需的空间。size参数是一个constraint ,用于在绘制文本时作为参考。但是,如果绘制完整个文本需要更大的空间,则返回的矩形大小可能比size更大。一般,绘制时会采用constraint提供的宽度,但高度则会根据需要而定.

options

文本绘制时的附加选项NSStringDrawingOptions(iOS 6_0)
1 NSStringDrawingUsesLineFragmentOrigin
绘制文本时使用line fragement origin而不是baseline origin。

2 NSStringDrawingUsesFontLeading
计算行高时使用行距。(字体大小+行间距=行距)

3 NSStringDrawingUsesDeviceMetrics
计算布局时使用图元字形(而不是印刷字体)。

4 NSStringDrawingTruncatesLastVisibleLine
如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定选项,则该选项被忽略

context

context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为nil。

特殊情况

为了计算文本块的大小,该方法采用默认基线。
如果NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个bug,在iOS6中,宽度会被忽略)

显示全文