NSAttributedString

Last-modified: 2015-08-18 (火) 15:03:59

この翻訳は2012-09-19のバージョンのものです。


スーパークラス:NSObJect
適合プロトコル:NSCopying, NSSecureCoding, NSObject, NSMutableCopying
フレームワーク:Foundation in iOS3.2 and later, More lerated items ...



概要

NSAttributedString オブジェクトは文字列とその属性(たとえばフォントやカーニングなど)を管理するもので、これは一つ一つの文字または文字列について、指定する範囲の文字に適用されます。文字とその属性が組になったものが属性付き文字列です。2つのパブリッククラスのクラスター、NSAttributedStringNSMutableAttributedString? があり、前者は読み専用の属性付き文字列、後者は読み書き可能な属性文字列へのプログラムインターフェイスを宣言しています。

属性付き文字列は名前で識別されいて、NSDictionay オブジェクトを使い、その名前をキーとして保持しています。お好みの名前/値のペアーを文字列の範囲に割り振ることができ、その名前をカスタム属性としてアプリ全体で使用可能です(属性付き文字列のプログラミングガイド NSMutableAttributedString? を参照してください)。Core Text フレームワークで属性付き文字列を使うと、そこで定義されている属性も利用できます。iOS においては、標準の属性が NSAttributedString UIKit Additions Reference? にある「定数」の項目に載っています。おなじように OSX では NSAttributedString Application Kit Additions Reference にあります。

属性付き文字列は、これを受け付ける API、たとえば Core Text で使用できます。Application Kit と UIKit でも NSMutableAttributedString のサブクラスである NSTextStorage? を提供しており、これはより拡張されたテキストの操作方法を備えています。iOS 6 以降では属性付き文字列を テキストビューやテキストフィールド、そのほかのコントロールでテキストを表示するのに使えます。AppKit および UIKit においては、必要不可欠な属性付き文字列にまでインターフェイスを拡張し、グラフィックコンテキストの中で、そのコンテキストを描画することができるようになります。

NSAttributedString オブジェクトのデフォルトフォントは Helvetica 12 ポイントですが、プラットフォームよっては違うフォントの可能性があります。したがって、開発しているアプリに適している、デフォルトではない属性の文字列がほしいときがあるでしょう。NSParagraphStyle? とそのサブクラスの NSMutableParagraphStyle? をパラグラフをカプセル化に使用することもできますが、NSAttributedString を使用して統一した属性を使用することもできます。

2つの NSAttributedString オブジェクトが厳密に同じかどうか isEqual: メソッドを使用するときは注意してください。ここでの比較には、一つ一つの文字の組が同じかどうか調べるとともに、それぞれの属性すべてもチェックします。この比較では、もし属性付き文字列に付加的属性やリスト、テーブルなどの属性がたくさん付いている場合には失敗するでしょう。

NSAttributedString クラスは、Core Foundation で対となる CFAttributedStringRef? と "toll-free bridged?” です。詳しくは[[Toll-Free Bridging>guide/Toll-Free Bridging]を参照してください。

タスク

NSAttributedString オブジェクトの生成

- initWithString:

属性情報を持たない文字列をから初期化した NSAttributedString オブジェクトを返す。

宣言
SWIFT

	init(string '''aString''': String)

OBJECTIVE-C

	- (instancetype)initWithString:(NSString *)aString


パラメータ

aString新しいオブジェクトでの文字列

戻り値
属性情報を持たない aString 文字列をもって初期化した NSAttributedString オブジェクト。返されるオブジェクトは本来のレシーバとはちがう可能性があります。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C
    @import Foundation;
SWIFT
    import Foundation

Availability
Available in iOS 3.2 and later.


- initWithAttributedString:

与えられた属性付き文字列の文字と属性をもった NSAttributedString オブジェクトを返します。

宣言
SWIFT

	init(attributedString attributedString: NSAttributedString)

OBJECTIVE-C

	- (instancetype)initWithAttributedString:(NSAttributedString *)attributedString


パラメータ

attributedString属性付き文字列


戻り値
与えられた属性付き文字列の文字と属性をもった NSAttributedString オブジェクト。返されるオブジェクトは本来のレシーバとは違う可能性があります。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C
    @import Foundation;
SWIFT
    import Foundation

Availability
Available in iOS 3.2 and later.


- initWithString:attributes:

引数の文字列と属性で初期化された NSAttributedString オブジェクトを返します。

宣言
SWIFT

	init(string aString: String, attributes attributes: [NSObject : AnyObject]?)

OBJECTIVE-C

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


パラメータ

aString新しい属性文字列での文字列
attributes新しい属性文字列での属性。ここで辞書に含められる属性キーについては、この書類の概要を参照してください


考察
引数の aString 文字列と attributes 属性で初期化された NSAttributedString オブジェクトを返します。返されるオブジェクトは本来のレシーバとは違う可能性があります。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.


文字情報の取得

string Property

レシーバーがもつ文字列を NSString オブジェクトとして表現したもの(読み専用)。

宣言
SWIFT

	var string: String { get }

OBJECTIVE-C

	@property(readonly, copy) NSString *string


考察
このプロパティは、付加されている文字が取り除かれていません。

パフォーマンスを上げるために、この属性付き文字列のオブジェクトが内部で保存している領域から直接に、このプロパティを返しています。オブジェクトを保存しつつ、このプロパティの文字列を操作する場合は、適切なコピーを使用すべきでしょう。

この基本的なプロパティは属性付き文字列の文字を効率よく取得しなくてはなりません。したがって、このクラスのサブクラスを作成したら、O(1) time 以内に取得できるようにすべきでしょう。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.


length Property

レシーバが持つ文字列オブジェクトの長さ(読み専用)。

宣言
SWIFT

	var length: Int { get }

OBJECTIVE-C

	@property(readonly) NSUInteger length


Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in OS X v10.0 and later.

See Also
length (NSString)
size (NSAttributedString)


属性情報の取得

- attributesAtIndex:effectiveRange:

引数のインデックス位置にある属性を返す。

宣言
SWIFT

	func attributesAtIndex(_ index: Int, effectiveRange aRange: NSRangePointer) -> [NSObject : AnyObject]

OBJECTIVE-C

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


パラメータ

index返す属性があるインデックス。レシーバの境界以内を指定します。
aRange値を返すにあたり、属性名とその値が存在する範囲はインデックスのそれと同じです。この範囲は適用の全域でなくても構わず、その程度は実装方法に依存しています。最大の範囲が必要なら、attributesAtIndex:longestEffectiveRange:inRange: メソッドを使用してください。この値が不要なら、NULL を渡してください。


戻り値
インデックスの位置にある文字の属性。

考察
レシーバーの文字の終わりを越えたインデックスを与えると、NSRangeException が発生します。

返された辞書にある属性キーを調べたい場合は、この書類の概要部分を参照してください。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.

See Also
– attribute:atIndex:effectiveRange:


- attributesAtIndex:longestEffectiveRange:inRange:

引数インデックスの位置にある文字列の属性かえします。属性が適用されている範囲をリファレンスを使って格納します。

宣言
SWIFT

	func attributesAtIndex(_
		index: Int,
		longestEffectiveRange aRange: NSRangePointer,
		inRange rangeLimit: NSRange) -> [NSObject : AnyObject]

OBJECTIVE-C

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


パラメータ

index返すべき属性があるインデックス。この値がレシーバの境界を越えてはいけません。
aRangeこれが NULL 以外なら、返すにあたり、属性名と値がインデックス位置と同じである範囲の内、最大のものがこのaRangeに格納されます。その際、raangeLimitで指定された範囲内へ切りとられます。
rangeLimitインデックスの位置にある属性が続けて存在するまで探す範囲を制限する範囲。この値はレシーバの境界を越えてはいけません。


考察
インデックスかrangeLimitがレシーバ文字の終わり以降を指定すると、NSRangeException が発生します。

範囲の情報を必要としないなら、attributesAtIndex:effectiveRange: メソッドを使う方がよいでしょう。

返される辞書での属性名を調べるには、この文章の概要部分を参照してください。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.




See Also
– attribute:atIndex:longestEffectiveRange:inRange:


- attribute:atIndex:effectiveRange:

インデックスの位置にある文字につけられている属性のうち、引数の属性名の値を返す。くわえて、属性が適用されている範囲を参照で返します。

宣言
SWIFT

	func attribute(_
		attributeName: String,
		atIndex index: Int,
		effectiveRange aRange: NSRangePointer) -> AnyObject?

OBJECTIVE-C

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


パラメータ

attributeName属性の名前
index返す属性のインデックス。レシーバの境界を越えてはいけません

|aRange|NULL でない場合

  • インデックスの位置に名前付きの属性があれば、aRange には名前付き属性の値が適用されている範囲が入れられます。
  • インデックスの位置に名前付きの属性がなければ、aRange には指定した属性が存在していない範囲が入れられます。|

この範囲は、attributeName が適用されている最大範囲である必要がなく、実行範囲は実装に依存しています。最大範囲が必要なら、attribute:atIndex:longestEffectiveRange:inRange: メソッドを使ってください。この値が不要なら、NULL を渡してください。|

戻り値
The value for the attribute named attributeName of the character at index index, or nil if there is no such attribute.
indexの位置にある文字において、属性名attributeNameの値を返します。属性名が見当たらないなら、nilを返します。

考察
インデックスがレシーバ文字の終わりを越えているなら、NSRangeException が発生します。
返される辞書にある属性名については、この書類の概要部分をお読みください。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.




See Also
– attributesAtIndex:effectiveRange:


I

- attribute:atIndex:longestEffectiveRange:inRange:

インデックスの位置にある文字について、属性名に対応する属性の値を返します。くわえて、その属性が適用されている範囲の参照も得られます。

宣言
SWIFT

func attribute(_
		attributeName: String,
		atIndex index: Int,
		longestEffectiveRange aRange: NSRangePointer,
		inRange rangeLimit: NSRange) -> AnyObject?



OBJECTIVE-C

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


パラメータ

attributeName属性名
indexattributeNameを適用するインデックス位置

|aRange|NULL でない場合

	・インデックスの位置に名前付きの属性があれば、aRange には名前付き属性の値が適用されている範囲が入れられます。
	・インデックスの位置に名前付きの属性がなければ、aRange には指定した属性が存在していない範囲が入れられます。

この値が不要なら、NULL を渡してください。|

rangeLimitattributeNameが連続して存在する範囲。この値はレシーバの境界を越えてはいけません。


戻り値
インデックス位置にある文字に適用されている 属性名 attributeName の値。属性名に対応するものがない場合は nil。

考察
インデックスかrangeLimit のどれもがレシーバの文字の終わりを越える場合は、NSRangeException が発生します。

もっとも長い適用範囲を必要としないなら、属性値を得るのには attribute:atIndex:effectiveRange: メソッドの方が効率がはるかによいです。

返される辞書にある属性名については、この文章の概要部分を読んでください。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.




See Also
– attributesAtIndex:longestEffectiveRange:inRange:


属性付き文字列を比較する

- isEqualToAttributedString:

引数の属性付き文字列とレシーバが同じかどうかを示すブール値を返す。

宣言
SWIFT

func isEqualToAttributedString(_ otherString: NSAttributedString) -> Bool

OBJECTIVE-C

- (BOOL)isEqualToAttributedString:(NSAttributedString *)otherString


パラメータ

otherStringレシーバと比較する属性付き文字列


戻り値
レシーバと otherString が同じなら YES、違うなら NO。

考察
ふたつの属性付き文字列が同じとは、すべてで文字と属性が一致するということです。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.


文字列を抽出する。

- attributedSubstringFromRange:

レシーバのうち、引数の範囲にある文字と属性からなる NSAttributeSting オブジェクトを返す。

宣言
SWIFT

func attributedSubstringFromRange(_ aRange: NSRange) -> NSAttributedString

OBJECTIVE-C

- (NSAttributedString *)attributedSubstringFromRange:(NSRange)aRange
&br;

パラメータ

aRange新しい属性付き文字列を得る範囲。aRange はレシーバの境界を越えてはいけません


戻り値
レシーバのうち、aRange 範囲にある属性付き文字列からなる NSAttributedString オブジェクト。

考察
aRange がレシーバ文字の終わりを越えるなら、NSRangeException が発生します。このメソッドでは、文字の長さを有効な範囲として扱い、空白部分は空の文字列として返します。

Import Statement and Availability

Import Statement, Availability and See Also
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 3.2 and later.


文字列にある属性を列挙する

- enumerateAttribute:inRange:options:usingBlock:

指定する範囲において、特定の属性に作用するブロックを実行する。

宣言
SWIFT

func enumerateAttribute(_ attrName: String,
				nRange enumerationRange: NSRange,
				options opts: NSAttributedStringEnumerationOptions,
				usingBlock block: (AnyObject!,
								NSRange,
								UnsafeMutablePointer<ObjCBool>) -> Void)

OBJECTIVE-C

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


パラメータ

attrName属性名
enumerationRangeNULL でないなら、属性名と値を列挙する最大範囲。これはさらにenumerationRange 範囲で切りとられる
opts列挙で使用するオプション。この値は C のビット演算子 OR でつなげることができる。これはNSAttributedStringEnumerationOptions 記法で表現する。
 

block
属性付き文字列のなかにある、決められた範囲の属性に適用するブロック。
ブロックは三つの引数を取ります。

valueattrName の名前
range実行範囲を示す NSRange
stopブール値への参照。ブロックの中でこれに YES をセットすることで、以降の実行を停止できる。引数 Stop は外から変更できず、ただブロックの中でのみ YES に設定できます。


考察
このメソッドが NSMutableAttributedString のインスタンスに送られたときのみ、ミューテーション(削除、追加、変更)が許されており、それはまたブロックへ指定された範囲の中のみです。ミューテーションをすると、これを適用した範囲の次へ連続的に列挙をおこなって行きます。つまり、処理が完了した長さはミューテーションに合わせていきます。(列挙体は基本的に特定の範囲で起こっている長さは変更されていると仮定しています)。

たとえば、ブロックが N のインデックス位置で始め、ブロックが与えられた範囲の文字をすべて削除した場合、ブロックが次に呼ばれたときにもまた範囲のインデックスが N として渡されます。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 4.0 and later.


- enumerateAttributesInRange:options:usingBlock:

与えられた範囲にあるすべての属性に対してブロックを実行する。

- enumerateAttributesInRange:options:usingBlock:

与えられた範囲にあるすべての属性に対してブロックを実行する。

宣言
SWIFT

func enumerateAttributesInRange(_ enumerationRange: NSRange,
				options opts: NSAttributedStringEnumerationOptions,
				usingBlock block: ([NSObject : AnyObject]!,
				NSRange,
				UnsafeMutablePointer<ObjCBool>) -> Void)

OBJECTIVE-C

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


パラメータ

enumerationRangeNULL ではないなら、この引数は列挙する属性とその値の最大範囲の内に切りとる範囲を指定します。
opts列挙で使用するオプション。この値は C のビット演算子 OR でつなげることができる。NSAttributedStringEnumerationOptions 記法で表現する。


block
属性付き文字列のなかにある属性へ適用するブロック。
ブロックは三つの引数を取る。

attrs範囲へ適用する属性が入った NSDictionay。
range実行する範囲 NSRange。
stopブール値への参照。ブロックの中でこれに YES をセットすることで、以降の作業を停止できる。引数 Stop は外から変更できず、ただブロックの中でのみ YES に設定できます。


考察
このメソッドが NSMutableAttributedString のインスタンスに送られたときのみ、ミューテーション(削除、追加、変更)が許されており、ブロックへ指定する範囲の中のみです。ミューテーションをすると、これを適用した範囲の直後から続けて列挙をおこなって行きます。つまり、処理が完了した長さはミューテーションに合わせていきます。(列挙体は基本的に特定の範囲で起こっている長さは変更されていると仮定しています)。
たとえば、ブロックが N のインデックス位置で始め、ブロックが与えられた範囲の文字をすべて削除した場合、ブロックが次に呼ばれたときにもまた範囲のインデックスが N として渡されます。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 4.0 and later.


宣言
SWIFT

func enumerateAttributesInRange(_ enumerationRange: NSRange,
				options opts: NSAttributedStringEnumerationOptions,
				usingBlock block: ([NSObject : AnyObject]!,
				NSRange,
				UnsafeMutablePointer<ObjCBool>) -> Void)

OBJECTIVE-C

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


パラメータ

enumerationRangeNULL ではないなら、この引数は列挙する属性とその値の最大範囲の内に切りとる範囲を指定します。
opts列挙で使用するオプション。この値は C のビット演算子 OR でつなげることができる。NSAttributedStringEnumerationOptions 記法で表現する。

block
属性付き文字列のなかにある属性へ適用するブロック。
ブロックは三つの引数を取る。

attrs範囲へ適用する属性が入った NSDictionay。
range実行する範囲 NSRange。
stopブール値への参照。ブロックの中でこれに YES をセットすることで、以降の作業を停止できる。引数 Stop は外から変更できず、ただブロックの中でのみ YES に設定できます。


考察
このメソッドが NSMutableAttributedString のインスタンスに送られたときのみ、ミューテーション(削除、追加、変更)が許されており、ブロックへ指定する範囲の中のみです。ミューテーションをすると、これを適用した範囲の直後から続けて列挙をおこなって行きます。つまり、処理が完了した長さはミューテーションに合わせていきます。(列挙体は基本的に特定の範囲で起こっている長さは変更されていると仮定しています)。
たとえば、ブロックが N のインデックス位置で始め、ブロックが与えられた範囲の文字をすべて削除した場合、ブロックが次に呼ばれたときにもまた範囲のインデックスが N として渡されます。

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 4.0 and later.


定数

NSAttributedStringEnumerationOptions

これらの定数は enumerateAttribute:inRange:options:usingBlock: と enumerateAttributesInRange:options:usingBlock: メソッドで使用するオプションです。

宣言
SWIFT

struct NSAttributedStringEnumerationOptions : RawOptionSetType {
				init(_ rawValue: UInt)
				init(rawValue rawValue: UInt)
				static var Reverse: NSAttributedStringEnumerationOptions { get }
				static var LongestEffectiveRangeNotRequired: NSAttributedStringEnumerationOptions { get }
}

OBJECTIVE-C

enum {
				NSAttributedStringEnumerationReverse = (1UL << 1),
				NSAttributedStringEnumerationLongestEffectiveRangeNotRequired = (1UL << 20)
};
typedef NSUInteger NSAttributedStringEnumerationOptions;


定数

  • NSAttributedStringEnumerationReverse
    列挙を逆順におこないます
    Available in iOS 4.0 and later.

  • NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
    このオプション定数が与えられると、最も長い有効範囲での操作がおこなわれません。ブロックは同じ属性値を持つ一続きの属性について操作をおこないます。
    Available in iOS 4.0 and later.

Import Statement and Availability

Import Statement and Availability
Import Statement
OBJECTIVE-C

@import Foundation;

SWIFT

import Foundation


Availability
Available in iOS 4.0 and later.


Document Revision History

DateNotes
2012-09-19iOS 6 で属性付き文字列のサポートを強化したのにともなったアップデート
それ以前訳者が省略 :-)