ここでは、文字列にいろいろと属性をつけて扱う NSMutableAttributedString について書いていく。
NSTableView のセルに tableView_objectValueForTableColumn_row(tableView,col,row) で文字列を表示させる時などに、
表示させる文字列ごとにいろいろいじるためのもの、と、とりあえず考えておく
まず、Ruby の String オブジェクトか NSString オブジェクト(要は文字列)から、NSMutableAttributedString オブジェクトを作る。
もし、変数が数値だった場合 to_s で文字列に変換する必要がある。
NSAttributedString
文字属性を持った NSAttributedString オブジェクトを作りたい場合は、initWithString_attributes(string,attributes) というメソッドを使ってつくり attributes で属性を指定する。これでは、できた文字列全体が指定した属性を持つことになる。属性の指定の仕方は、この後の NSMutableAttributedString のものと変わらない。
attributedText = NSAttributedString.alloc.initWithString_attributes(string,attributes)
NSMutableAttributedString
MutableAttributedString だと、string の一部だけに attributes を反映させるたり、後で全部もしくは一部の属性を変更することができるの。ここでは、output という NSMutableAttributedString オブジェクトを作ることで話を進める。
output = NSMutableAttributedString.alloc.initWithString(string)
続いて、この output という NSMutableAttributedString オブジェクトに addAttribute_value_range(attribute,value,range) で属性を付けていく。
output.addAttribute_value_range(attribute,value,range)
複数の属性を付けたい場合には、NSDictionary もしくは Ruby の Hash で属性と値を用意して addAttributes_range(attributes,range) で付ける。
output.addAttributes_range(attributes,range)
属性の指定
attributes は次のような感じで、initWithObjects_forKeys(objects,keys) とか initWithObjectsAndKeys(object1,key1,object2,key2,nil) を使って NSDictionary オブジェクトを作る。
objects = [value1,value2]
keys = [key1,key2]
attributes = NSDictionary.alloc.initWithObjects_forKeys(objects,keys)
まあ、せっかく RubyCocoa なんで Ruby の Hash を使った方が楽か。
attributes = {key1 => value1, key2 => value2}
もしくは、
attributes = Hash.new
attributes[key1] = value1
attributes[key2] = value2
範囲 range は、 NSRange オブジェクトか Ruby の Range オブジェクトをいれる。ただし、指定の方法が違うので注意。どちらも、一つ目は、最初の文字列の位置だけど、2つ目は、NSRange の方は文字列の長さ(文字数)で、Ruby の Range は最後の文字列の位置(たぶん文字単位、0から始まる)。
NSRange.new(position,length)
Range.new(first,last)
追記:NSRange は Ruby の配列で記述できるので [position,length] という配列で代用できる。
まあ、使い回す場合は、オブジェクトを作っておくのがいい。ここでは、range という名前の NSRange オブジェクトを作っておく。
range = NSRange.new(position,length)
attribute と value はいろいろなものが指定できるけど、全部は書かない。細かいことは、Xcode のデベロッパドキュメントを参照。
フォント
フォントを指定したい場合は、 NSFontAttributeName を attribute に指定して、NSFont.fontWithName_size(font name,size) でフォントと文字の大きさを指定する。Lucida Grande の14ポイントにする場合は、次のように書く。
output.addAttribute_value_range(NSFontAttributeName,NSFont.fontWithName_size("Lucida Grande",14.0),range)
フォントの色
フォントの色を指定したい場合は、 NSForegroundColorAttributeName を attribute に指定して、NSColor で value を指定する。NSColor での色の扱い方については、色の扱いを参照。プリセットされている色を使うには、NSColor.blackColor の形式で、使いたい色を選べばよい。選べる色は次の通り。
blackColor, blueColor, brownColor, clearColor, cyanColor, darkGrayColor, grayColor, greenColor, lightGrayColor, magentaColor, orangeColor, purpleColor, redColor, whiteColor, yellowColor
これを使って、指定した範囲の文字を赤くするには、次のように書く。
output.addAttribute_value_range(NSForegroundColorAttributeName,NSColor.redColor,range)
下線
文字に下線を引きたい場合は、NSUnderlineStyleAttributeName を attribute に指定して、value を true(もしくは 1)にする。これで標準の太さの下線が引かれる。
output.addAttribute_value_range(NSUnderlineStyleAttributeName,true,range)
もし標準以外の線を引きたければ、線の value を次のものから選ぶ。順に、線なし、標準線、太線、二重線。
NSUnderlineStyleNone, NSUnderlineStyleSingle, NSUnderlineStyleThick, NSUnderlineStyleDouble
また、下線に色をつけたい場合は、NSUnderlineColorAttributeName で指定し NSColor で value を指定する。
これらを使って、指定した範囲の文字に赤で太めの下線ひくには、次のように書く。
output.addAttribute_value_range(NSUnderlineStyleAttributeName,NSUnderlineStyleThick,range)
output.addAttribute_value_range(NSUnderlineColorAttributeName,NSColor.redColor,range)
打ち消し線
打ち消し線を引きたい場合は、NSStrikethroughStyleAttributeName を attribute に指定する。また、打ち消し線に色をつけたい場合は、それぞれ、NSUnderlineColorAttributeName、NSStrikethroughColorAttributeName で指定し NSColor で value を指定する。
NSStrikethroughStyleAttributeName と同様に線の value は次のものから選ぶ。順に、線なし、標準線、太線、二重線。
NSUnderlineStyleNone, NSUnderlineStyleSingle, NSUnderlineStyleThick, NSUnderlineStyleDouble
これらを使って、指定した範囲の文字に赤で太めの打ち消し線をひくには、次のように書く。
output.addAttribute_value_range(NSStrikethroughStyleAttributeName,NSUnderlineStyleThick,range)
output.addAttribute_value_range(NSStrikethroughColorAttributeName,NSColor.redColor,range)
袋文字
文字を袋文字にしたい場合は、NSStrokeWidthAttributeName を attribute に指定して、value に数値を入れる。0で通常の文字、3で標準的な袋文字。数値が大きくなるほど、袋文字を各線が太くなる。文字が小さい場合は、あまり大きくすると袋文字に見えなくなる。また、NSStrokeColorAttributeName を attribute に指定して、NSColor で袋文字の色を指定する事もできる。ただ、NSForegroundColorAttributeName で文字の色を指定するときとの違いはわからない。
これらを使って、指定した範囲の文字を標準的な青い袋文字にするには、次のように書く。
output.addAttribute_value_range(NSStrokeWidthAttributeName,3,range)
output.addAttribute_value_range(NSStrokeColorAttributeName,NSColor.blueColor,range)
影文字(shadow)
文字に影を付けたい場合は、NSShadowAttributeName を attribute に指定して、value を NSShadow オブジェクトで指定する。
NSShadow オブジェクトは、まず普通に作って設定していく。ここでは、shadow というオブジェクトを作る。
shadow = NSShadow.new
設定には、setShadowOffset、setShadowBlurRadius、setShadowColor の3つがある。
setShadowOffset は、影がどれだけずれるかを NSSize で指定する。NSSize オブジェクトの作り方は、NSSize.new(width,height)。ただ実際は、NSSize の代わりに Ruby の Array オブジェクトを入れてやれば動くので、その方が楽かと。width で横方向(右方向)のずれ、height で縦方向(上方向)のずれを指定する。負の値だと、逆方向のずれにできる。setShadowBlurRadius は、影をどれだけぼやけさせるかを数値で指定する。0でぼやけない。数値が大きくなるほどぼやける。小数でも指定できる。setShadowColor は、影の部分の色を NSColor で指定する。
これらを使って、指定した範囲の文字を右上にちょっとずれて、少しぼやけた影をシアンで表示するには、次のように書く。
shadow = NSShadow.new
shadow.setShadowOffset(NSSize.new(3,2))
( shadow.setShadowOffset([3,2]) )
shadow.setShadowBlurRadius(3.0)
shadow.setShadowColor(NSColor.cyanColor)
output.addAttribute_value_range(NSShadowAttributeName,shadow,range)
背景の色
指定した文字の背景に色をつけたい場合は、NSBackgroundColorAttributeName を attribute に指定して、NSColor で value を指定する。
これを使って、指定した範囲の文字の背景だけを黄色にするには、次のように書く。
output.addAttribute_value_range(NSBackgroundColorAttributeName,NSColor.yellowColor,range)
オフセット
指定した文字を上下にずらすには、NSBaselineOffsetAttributeName を attribute に指定して、数値(point)を value に入れる。小数でもいい。正の数値だと上にずれ、負の数値だと下にずれる。
これを使って、指定した範囲の文字の少し上にずらすには、次のように書く。
output.addAttribute_value_range(NSBaselineOffsetAttributeName,5,range)
斜体文字
指定した文字を斜体文字するには、NSObliquenessAttributeName を attribute に指定して、数値(point)を value に入れる。小数でもいい。1.0 でも45度くらい傾いた文字になるので、1以下の小数で使うのがいいかと思う。
output.addAttribute_value_range(NSObliquenessAttributeName,0.5,range)
リンク
文字列にリンクを加えたい場合は、NSLinkAttributeName を attributed に指定して、リンクを value に入れる。
output.addAttribute_value_range(NSLinkAttributeName,"http://www.apple.com/",range)
これだけだと色はつかないので、NSForegroundColorAttributeName で色を指定する。
マウスカーソル
リンクを作ったら、その上にマウスカーソルが来たときはブラウザなんかであるように形を変えたい。そんなときは、NSCursorAttributeName でリンク上というか属性を付ける文字列の上に来たときにアイコンが変わるようにする。value は NSCursor のオブジェクト。指差してるようなアイコンは pointingHandCursor。
output.addAttribute_value_range(NSCursorAttributeName,NSCursor.pointingHandCursor,range)
これ以外のアイコンについては、デベロッパドキュメントを参照。
とりあえず、このくらいか。