遇到这个问题, 本来想找现成的方案,结果半天没合适的 于是自己搞了一个,其实挺简单,给需要的朋友:
- 直接上代码
- (void)viewDidLoad {
[super viewDidLoad];
NSString * string = @"你好";
[self conversionCharacterInterval:4 current:string withLabel:self.tempLabel];
NSString * string1 = @"你好吗";
[self conversionCharacterInterval:4 current:string1 withLabel:self.tempLabel1];
NSString * string2 = @"我不好呀";
[self conversionCharacterInterval:4 current:string2 withLabel:self.tempLabel2];
// Do any additional setup after loading the view, typically from a nib.
}
/**
* @brief 添加字符间距
*
* @param maxInteger 最大字符长度
* @param currentString 当前显示字符
* @param label 显示label
*/
- (void)conversionCharacterInterval:(NSInteger)maxInteger current:(NSString *)currentString withLabel:(UILabel *)label
{
CGRect rect = [@"你" boundingRectWithSize:CGSizeMake(200,label.frame.size.height)
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: label.font}
context:nil];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:currentString];
[attrString addAttribute:NSKernAttributeName value:@(((maxInteger - currentString.length) * rect.size.width)/(currentString.length - 1)) range:NSMakeRange(0, currentString.length)];
label.attributedText = attrString;
}
2 用到知识点: NSAttributedString UIKit Additions 参考文:
http://developer.apple.com/library/ios/#documentation/uikit/reference/NSAttributedString_UIKit_Additions/RevisionHistory.html
概述
UIKit 在 NSAttributedString 中加入了新的方法,以支持格式化文本的绘制、计算文本在绘制前的大小及空间。这些方法不影响文本的内容,只影响绘制的过程。
默认,文本绘制使用本地坐标,内容从某个点向右向下绘制。当你放置文本内容时,记住文本块的左上角就是绘制的起点。
你可以在主线程之外使用这些方法,但是,如果是支持NSStringDrawingContext 的任何方法,则无法跨过线程或 dispatch queue 共享 NSStringDrawiingContext。
实例方法
绘制文本
– drawAtPoint:
– drawInRect:
– drawWithRect:options:context:
计算文本的空间
– size
– boundingRectWithSize:options:context:
实例方法
boundingRectWithSize:options:context:
返回文本绘制所占据的矩形空间。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context
参数
size
宽高限制,用于计算文本绘制时占据的矩形块。
Thewidth and height constraints to apply when computing the string’s boundingrectangle.
options
文本绘制时的附加选项。可能取值请参考“NSStringDrawingOptions”。
context
context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。
返回值
一个矩形,大小等于文本绘制完将占据的宽和高。
讨论
可以使用该方法计算文本绘制所需的空间。size 参数是一个constraint ,用于在绘制文本时作为参考。但是,如果绘制完整个文本需要更大的空间,则返回的矩形大小可能比 size 更大。一般,绘制时会采用constraint 提供的宽度,但高度则会根据需要而定。
特殊情况
为了计算文本块的大小,该方法采用默认基线。
如果 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个 bug,在 iOS6 中,宽度会被忽略)
兼容性
iOS 6.0 以后支持。
声明于
NSStringDrawing.h
drawAtPoint:
从指定点(当前图形上下文)开始绘制文本。
- (void)drawAtPoint:(CGPoint)point
参数
point
当前图形上下文中的点,文本将从此开始绘制。该图形上下文的坐标系通常由当前正在绘制的视图定义。
讨论
该方法从某个点开始绘制整个文本。该方法根据 attributedstring 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。
兼容性
iOS 6.0 以后支持.
声明于
NSStringDrawing.h
drawInRect:
在当前图形上下文的指定矩形内绘制文本。
- (void)drawInRect:(CGRect)rect
参数
rect
指定绘制文本的矩形范围。
讨论
该方法在指定矩形内绘制尽可能多的文本内容,必要时会压缩字符。如果对于该矩形来说,文本内容太长,该方法绘制尽可能多的内容,剩余内容将被剪切。该方法用 attributed string 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。
兼容性
Available in iOS 6.0 and later.
Declared In
NSStringDrawing.h
drawWithRect:options:context:
用提供的选项将文本绘制到指定的矩形分为内。
- (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context
参数
rect
指定在某个矩形中绘制文本。
options
文本绘制选项。可能取值请参考“NSStringDrawingOptions”。
context
上下文对象,用于包含信息:如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil。
讨论
该方法在指定矩形内绘制尽可能多的文本内容,必要时会对字符进行压缩。如果矩形内要绘制的文本内容太长,该方法将根据需要缩放字体,或者调整字符间距。
该方法用 attributed string 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。
特殊情况
该方法采用默认基线。
如果NSStringDrawingUsesLineFragmentOrigin 未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个 bug,在 iOS6 中,宽度会被忽略)
兼容性
iOS 6.0 以后支持.
声明于
NSStringDrawing.h
size
返回文本绘制所需 size。
Returns the sizerequired to draw the string.
- (CGSize)size
返回值
绘制完整文本所需的最小 size。
讨论
可以用该方法在绘制之前计算需要多大空间。
兼容性
iOS 6.0 以后支持.
声明于
NSStringDrawing.h
常量
NSStringDrawingOptions
文本绘制选项。
enum {
NSStringDrawingTruncatesLastVisibleLine= 1 << 5,
NSStringDrawingUsesLineFragmentOrigin= 1 << 0,
NSStringDrawingUsesFontLeading= 1 << 1,
NSStringDrawingUsesDeviceMetrics= 1 << 3,
};
typedef NSInteger NSStringDrawingOptions;
常量
NSStringDrawingTruncatesLastVisibleLine
如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果指定了NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。
NSStringDrawingUsesLineFragmentOrigin
绘制文本时使用 line fragement origin 而不是 baseline origin。
Theorigin specified when drawing the string is the line fragment origin and notthe baseline origin.
NSStringDrawingUsesFontLeading
计算行高时使用行间距。(译者注:字体大小+行间距=行高)
NSStringDrawingUsesDeviceMetrics
计算布局时使用图元字形(而不是印刷字体)。
Usethe image glyph bounds (instead of the typographic bounds) when computinglayout.
划线样式属性
指定下划线或删除线样式。
enum {
NSUnderlineStyleNone = 0x00,
NSUnderlineStyleSingle= 0x01,
};
常量
NSUnderlineStyleNone
不划线。
NSUnderlineStyleSingle
单线
讨论
可以在属性字串的 NSUnderlineStyleAttributeName和NSStrikethroughStyleAttributeName属性上使用这些常量。
字符属性
字符属性可以应用于 attributed string 的文本中。
NSString *const NSFontAttributeName;
NSString *const NSParagraphStyleAttributeName;
NSString *const NSForegroundColorAttributeName;
NSString *const NSBackgroundColorAttributeName;
NSString *const NSLigatureAttributeName;
NSString *const NSKernAttributeName;
NSString *const NSStrikethroughStyleAttributeName;
NSString *const NSUnderlineStyleAttributeName;
NSString *const NSStrokeColorAttributeName;
NSString *const NSStrokeWidthAttributeName;
NSString *const NSShadowAttributeName;
NSString *const NSVerticalGlyphFormAttributeName;
常量
NSFontAttributeName
该属性所对应的值是一个 UIFont 对象。该属性用于改变一段文本的字体。如果不指定该属性,则默认为12-point Helvetica(Neue)。
NSParagraphStyleAttributeName
该属性所对应的值是一个 NSParagraphStyle 对象。该属性在一段文本上应用多个属性。如果不指定该属性,则默认为 NSParagraphStyle 的defaultParagraphStyle 方法返回的默认段落属性。
NSForegroundColorAttributeName
该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的字体颜色。如果不指定该属性,则默认为黑色。
NSBackgroundColorAttributeName
该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的背景颜色。如果不指定该属性,则默认无背景色。
NSLigatureAttributeName
该属性所对应的值是一个 NSNumber 对象(整数)。连体字符是指某些连在一起的字符,它们采用单个的图元符号。0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)。
NSKernAttributeName
该属性所对应的值是一个 NSNumber 对象(整数)。字母紧排指定了用于调整字距的像素点数。字母紧排的效果依赖于字体。值为 0 表示不使用字母紧排。默认值为0。
NSStrikethroughStyleAttributeName
该属性所对应的值是一个 NSNumber 对象(整数)。该值指定是否在文字上加上删除线,该值参考“Underline Style Attributes”。默认值是NSUnderlineStyleNone。
NSUnderlineStyleAttributeName
该属性所对应的值是一个 NSNumber 对象(整数)。该值指定是否在文字上加上下划线,该值参考“Underline Style Attributes”。默认值是NSUnderlineStyleNone。
NSStrokeColorAttributeName
该属性所对应的值是一个 UIColor 对象。如果该属性不指定(默认),则等同于 NSForegroundColorAttributeName。否则,指定为删除线或下划线颜色。更多细节见“Drawing attributedstrings that are both filled and stroked”。
NSStrokeWidthAttributeName
该属性所对应的值是一个 NSNumber 对象(小数)。该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。
NSShadowAttributeName
该属性所对应的值是一个 NSShadow 对象。默认为 nil。
NSVerticalGlyphFormAttributeName
该属性所对应的值是一个 NSNumber 对象(整数)。0 表示横排文本。1 表示竖排文本。在 iOS 中,总是使用横排文本,0 以外的值都未定义。