NSAttributedString类

继承自 NSObject
符合 NSCoding
NSCopying
NSMutableCopying
NSObject(NSObject)
框架 /System/Library/Frameworks/Foundation.framework
可用性 可用于iOS 2.0或者更晚的版本
声明于 Foundation/NSAttributedString.h
参考指南 Attributed String Programming Guide
示例代码 CoreTextPageViewer
Quartz2D for iOS
SimpleTextInput
UICatalog

概览

一个NSAttributedString实例管理字符串和与其相关联的属性集(比如,字体和字距),适用于单个字符或者字符串中一个范围内的字符。一个带有属性的字符的组合被称为属性字符串。类簇的两个公有类,NSAttributedString和NSMutableAttributedString,分别声明了只读属性字符串和可变属性字符串的编程接口。

属性字符串用名字标示属性,使用一个字典对象来保存给定名字的值。你可以在你想要的字符范围内制定任意属性的名字或值-它是由你的应用程序来解释自定义属性。(参考Attributed String Programming Guide)。如果你在Core Text框架中使用属性字符串,你还可以使用那个框架中定义的属性键。在iOS中,标准属性键定义在NSAttributedString Application Kit Additions Reference的常量部分。在OS X中,标准属性键定义在NSAttributedString Application Kit Additions Reference的常量部分。你可以在任何接受属性字符串的API中使用它们,例如Core Text框架。在OS X中,Application Kit也是NSAttributedString的一个子类,叫做NSTextStorage,提供Application Kit的存储功能以扩展text-handing系统。在iOS 6或者更晚的系统中,你可以使用属性字符串在文本视图中显示格式文本,文本框或者一些其他空间。AppKit和UIKit都定义了属性字符串的基本接口,使你可以在当前的图形上下文中绘制它们的内容。

属性字符串的默认字体是Helvetica 12,这可能与平台的默认系统字体不一样。因此,你可以想要创建新的一个不用默认字体的属性字符串。你也可以使用NSParagraphStyle类和它的子类,来封装NSAttributedString中使用的段落或者标尺属性。

请注意,NSAttributedString使用isEqual:方法来比较两个对象是否相等。这个比较包括比较字符串中的每个字符相等以及字符创的所有属性相等。如果一个字符串有许多的属性,例如附件、列表、表等,这样的比较是不可能找到匹配的对象的。

有关iOS绘制属性字符串的方法和常量的信息,参考NSAttributedString UIKit Additions Reference。有关OS X支持RTF,画笔属性和绘制属性字符串方法的信息,参考NSAttributedString Application Kit Additions Reference。

NSAttributedString与它的Core框架的副本CFAttributedStringRef是免费桥接的。免费桥接更多信息参考“Toll-Free-Bridging”。

符合的协议

NSCoding

encodeWithCoder:

initWithCoder:

NSCopying

copyWithZone:

NSMutableCopying

mutableCopyWithZone:

方法

创建一个属性字符串对象。

- initWithString:

返回一个根据给定字符串初始化的没有属性信息的属性字符串。

- (id)initWithString:(NSString *)aString

参数 aString:一个字符串
返回值 一个属性字符串

- initWithAttributedString:

返回一个根据给定属性字符串初始化的属性字符串。

- (id)initWithAttributedString:(NSAttributedString *)attributedString

参数 attributedString:一个属性字符串
返回值 一个属性字符串

- initWithString:attributes

返回一个根据给定字符串和给定的属性初始化的属性字符串。

- (id)initWithString:(NSString *)aString attributes:(NSDictionary *)attributes

参数 aString:一个字符串
attributes:属性的字典
返回值 一个属性字符串

论述

返回的对象可能与原始接收的不同。

获取字符信息

- string

以字符串的形式返回接收者的字符内容。

- (NSString *)string

参数  
返回值 字符串对象形式的字符内容

论述

这个方法不剥离附着字符。

出于性能方面的考虑,这个方法返回当前后台存储的属性字符串对象。如果你想维持一个你操作的属性字符串的快照,你应该对适当的子串制作一个拷贝。

这种原始的方法必须保证对属性字符串的字符的高效访问;子类应该在O(1)的时间复杂度实现它。

- length

返回接收者的字符串对象的长度。

- (NSUInteger)length

获取属性信息。

- attributesAtIndex:effectiveRange:

返回给定下标的字符的属性。

- (NSDictionary *)attributesAtIndex:(NSUInteger)index effectiveRange:(NSRangePointer)aRange

参数 index:指定的下标,该值必须在于接收者的大小
aRange:返回后,范围包含的属性和值与那些在索引中找到的是相同的。这个范围不一定是最大范围,并且它的程度依赖于实现。如果你需要最大范围,使用attributesAtIndex:longestEffectiveRange:inRange方法。如果你不需要这个值,置空
返回值 指定下标字符的属性

论述

如果下标在最后的字符的后面,抛出一个NSRangeException。

要想了解返回字典的属性键的信息,参考该文档的概览部分。

- attributesAtIndex:longestEffectiveRange:inRange

返回给定下标的字符的属性,以及参考属性允许的范围。

- (NSDictionary *)attributesAtIndex:(NSUInterger)index longestEffectiveRange:(NSRangePointer)aRange inRange:(NSRange)rangeLimit

参数 index:指定的下标,该值必须在于接收者的大小
aRange:如果非空,返回后范围包含的属性和值与那些在索引中找到的是相同的。根据rangeLimit剪裁
rangeLimit:指定的范围,该值必须在于接收者的大小
返回值  

论述

如果index或者rangeLimit越界,抛出一个NSRangeException。

如果你不需要范围信息,使用attributesAtIndex:effectiveRange:更有效。

要想了解返回字典的属性键的信息,参考该文档的概览部分。

- attribute:atIndex:effectiveRange

返回给定下标的字符的名字的属性的值,以及参考属性允许的范围。

- (id)attribute:(NSString *)attributeName atIndex:(NSUInterger)index effectiveRange:(NSRangePointer)aRange

参数 attributeName:属性名字
index:指定的下标,该值必须在于接收者的大小
aRange:如果非空,如果名字属性在索引中存在,返回后的范围包含属性值允许的名字。如果名字属性在索引中不存在,返回后的包含这个属性的范围是不存在的。这个范围不一定是最大范围,并且它的程度依赖于实现。如果你需要最大范围,使用attributesAtIndex:longestEffectiveRange:inRange方法。如果你不需要这个值,置空
返回值 给定的下标的字符的名字的属性的值,如果没有则返回nil

论述

如果下标在最后的字符的后面,抛出一个NSRangeException。

要想了解返回字典的属性键的信息,参考该文档的概览部分。

- attribure:atIndex:longestEffectiveRange:inRange:

返回给定下标的字符的名字的属性的值,以及参考属性允许的范围。

- (id)attribure:(NSString *)attributeName atIndex:(NSUInterger)index longestEffectiveRange:(NSRangePointer)aRange inRange:(NSRange)rangeLimit

参数 attributeName:属性名字
index:属性名字的下标
aRange:如果非空,如果名字属性在索引中存在,返回后的范围包含属性值允许的名字。如果名字属性在索引中不存在,返回后的包含这个属性的范围是不存在的。这个范围不一定是最大范围,并且它的程度依赖于实现。如果你需要最大范围,使用attributesAtIndex:longestEffectiveRange:inRange方法。如果你不需要这个值,置空
rangeLimit:指定的范围,该值必须在于接收者的大小
返回值 给定下标的名字的属性的值,如果没有则返回nil

论述

如果index或者rangeLimit越界,抛出一个NSRangeException。

如果你不需要最大范围,使用attributesAtIndex:effectiveRange:更有效。

要想了解返回字典的属性键的信息,参考该文档的概览部分。

比较属性字符串

- isEqualToAttributedString:

- (BOOL)isEqualToAttributedString:(NSAttributedString *)otherString

参数 otherString:另一个属性字符串
返回值 相等返回YES,否则返回NO

论述

分别比表字符串中的字符和属性。

提取子串

- attributedSubstringFromRange:

- (NSAttributedString *)attributedSubstringFromRange:(NSRange)aRange

参数 aRange:创建子串的范围,必须依赖于接收者的大小
返回值 一个新的属性字符串

枚举字符串中的属性

- enumerateAttribute:inRange:options:usingBlock:

- (void)enumerateAttribute:(NSString *)attrName inRange:(NSRange)enumerationRange options:(NSAttributedStringEnumerationOptions)opts usingBlock:(void (^)(id value, NSRange range, BOOL *stop))block

参数 attrName:属性名
enumerationRange:如果非空,包含最大返回的属性和值的枚举,根据enumerationRange剪切范围
opts:枚举中使用的选项。这个值可以进行按位或的操作,可选值在NSAttributedStringEnumerationOptions中定义
block:适用于属性字符串属性的语法块
value:属性名
range:该属性运行的范围
stop:一个BOOL值,设置为YES可以停止进一步处理,这是一个只输出参数,你应该只把它设为YES
返回值  

论述

如果此方法被发送给一个NSMutableAttributedString对象,变化(删除,增加,改变)是允许的,只要在它语法块提供的范围内;变化后,枚举继续紧随处理范围,然后处理后的范围调整为变化后的范围。(枚举基本上假设了发生在指定范围内的任何长度变化)。

例如,语法块在起始于N的范围被调用,然后语法块删除范围内所有的字符,下一次调用还将从N开始。

- enumerateAttributesInRange:options:usingBlock:

- (void)enumerateAttributesInRange:(NSRange)enumerationRange options:(NSAttributedStringEnumerationOptions)opts usingBlock:(void (^)(id value, NSRange range, BOOL *stop))block

参数 enumerationRange:如果非空,包含最大返回的属性和值的枚举,根据enumerationRange剪切范围
opts:枚举中使用的选项。这个值可以进行按位或的操作,可选值在NSAttributedStringEnumerationOptions中定义
block:适用于属性字符串属性的语法块
value:属性名
range:该属性运行的范围
stop:一个BOOL值,设置为YES可以停止进一步处理,这是一个只输出参数,你应该只把它设为YES
返回值  

论述

如果此方法被发送给一个NSMutableAttributedString对象,变化(删除,增加,改变)是允许的,只要在它语法块提供的范围内;变化后,枚举继续紧随处理范围,然后处理后的范围调整为变化后的范围。(枚举基本上假设了发生在指定范围内的任何长度变化)。

例如,语法块在起始于N的范围被调用,然后语法块删除范围内所有的字符,下一次调用还将从N开始。

你可能感兴趣的:(NSAttributedString类)