ココTip 11から20

快技庵 > 開発情報 > ココTip 11から20

【11】角丸矩形を描く(塗りつぶす)

角丸はNSBezierPathの appendBezierPathWithArcFromPoint:toPoint:radius: を使い
ます。
次のように appendBezierPathWithRoundedRectangle:withRadius: をNSBezierPathのカテゴリ(RoundedRect)として実装すると、塗りつぶす場合にはfill、枠を
描く場合はstrokeを使い描くことができます。

▼注意:10.5からはこのカテゴリを追加しなくても appendBezierPathWithRoundedRect:xRadius:yRadius: が使えます。(2007.01.12追記)

▼注意:aRectの辺の長さとradiusの整合性のチェックをしていません。radius の値は短辺の1/2以下にしてください。

@interface NSBezierPath(RoundedRect)
- (void)appendBezierPathWithRoundedRectangle:(NSRect)aRect
                                                          withRadius:(float)radius;
@end


@implementation NSBezierPath(RoundedRect)

- (void)appendBezierPathWithRoundedRectangle:(NSRect)aRect
withRadius:(float)radius
{
    NSPoint topMid = NSMakePoint(NSMidX(aRect), NSMaxY(aRect));
    NSPoint topLeft = NSMakePoint(NSMinX(aRect), NSMaxY(aRect));
    NSPoint topRight = NSMakePoint(NSMaxX(aRect), NSMaxY(aRect));
    NSPoint bottomRight = NSMakePoint(NSMaxX(aRect), NSMinY(aRect));
    [self moveToPoint:topMid];
    [self appendBezierPathWithArcFromPoint:topLeft toPoint:aRect.originradius:radius];
    [self appendBezierPathWithArcFromPoint:aRect.origin
                         toPoint:bottomRightradius:radius];
    [self appendBezierPathWithArcFromPoint:bottomRight
                         toPoint:topRightradius:radius];
    [self appendBezierPathWithArcFromPoint:topRight toPoint:topLeft radius:radius];
    [self closePath];
}
@end


参考文献「Cocoa Programming」 p432より転記

使用例:

NSBezierPath *bp;
bp = [NSBezierPath bezierPath];
[bp appendBezierPathWithRoundedRectangle:frame withRadius:10.0];
// 50%透明のグレイで塗りつぶす
[[NSColor colorWithDeviceRed:0.5 green:0.5 blue:0.5 alpha:0.5] set];
[bp fill];


【12】画像サイズを変更してイメージを描く

NSImageオブジェクトに setScalesWhenResized:YES メッセージを送ってから setSize: メッセージで描くサイズを指定します。
setScalesWhenResized:YES しないと指定サイズでクリップされます。


NSImage *image;
NSRect destRect;
それぞれにイメージオブジェクトと表示する大きさをセッットした場合次のようになります。

[image setScalesWhenResized:YES];
[image setSize:destRect.size];

【13】ファイルをFinderで選択する

選択するファイルのフルパスをNSWorkspaceの selectFile:inFileViewerRootedAtPath: メソッドを使います。
(フルパスを指定しinFileViewerRootedAtPath:は@""で良い)


NSString *filePath;
filePathに選択するファイルのフルパスをセットしてある場合の例です。

[[NSWorkspace sharedWorkspace] selectFile:filePath inFileViewerRootedAtPath:@""]

【14】NSDateを書式指定して表示する

descriptionWithCalendarFormat:timeZone:locale: メソッドを使います。(指定した書式の文字列オブジェクトが得られます)
pathでフルパスを指定したファイルの修正日を書式指定する例:

NSDictionary *attr;
attr = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:NO];
NSString *mdateStr = [[attr objectForKey:NSFileModificationDate] descriptionWithCalendarFormat:@"%Y/%m/%d" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]

書式は Converting Dates to Strings の The Calendar Format に一覧表があります。
上記の例は
%Y 年 西暦4桁(1990など)
%m 月 数値の月(01〜12)
%d 日 数値の日(01〜31)
区切り文字にスラッシュを指定しているので 2008/01/04 などの文字列になります。

【15】色・書体・サイズを指定した文字表示

表示属性を辞書に登録しそれを利用して表示します。
通常のNSStringも 
drawInRect:withAttributes: や drawAtPoint:withAttributes: メソッドで指定した属性で表示できます。

strをdrawInRect:withAttributes:で表示する例:
ここでは m_infoStrAttributes はインスタンス変数です。書体やサイズ色は一度設定しその属性を何度も使います。

m_infoStrAttributes = [[NSMutableDictionary dictionary] retain];
[m_infoStrAttributes setObject:[NSFont userFontOfSize:InfoStrSize] forKey:NSFontAttributeName];
[m_infoStrAttributes setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName]; fileAttributesAtPath:path traverseLink:NO];


// 別のメソッドでstrを指定書式で表示します
[str drawInRect:frame withAttributes:m_infoStrAttributes];


【16】表示方法(揃え)を指定した文字表示

「中央揃え」などの表示方法は NSParagraphStyleAttributeName で表示属性に登録し drawInRect:withAttributes: メソッドを使って表示します。表示する矩形の幅に対して中央に表示します。

strをdrawInRect:withAttributes:で表示する例:
ここでは m_ m_fileNameAttributes はインスタンス変数です。パラグラフスタイルも一度設定しその属性を何度も使います。

#define FileNameSize (13.0)
m_fileNameAttributes = [[NSMutableDictionary dictionary] retain];
// 書体とサイズをアトリビュートに追加する
[m_fileNameAttributes setObject:[NSFont userFontOfSize:FileNameSize]
                                       forKey:NSFontAttributeName];
// 文字色をアトリビュートに追加する
[m_fileNameAttributes setObject:[NSColor darkGrayColor]
                                       forKey:NSForegroundColorAttributeName];
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle]
                                                                                                   mutableCopy];
// 「中央揃え」のスタイルをアトリビュートに追加する
[style setAlignment:NSCenterTextAlignment];
[m_fileNameAttributes setObject:style forKey:NSParagraphStyleAttributeName];
[style release];


// 別のメソッドでstrを指定書式で表示します
NSRect frame;
// 実際にはframe に表示位置と高さ幅を設定してください
[str drawInRect:frame withAttributes:m_fileNameAttributes];

こちらも参照してください。
setAlignment:
NSTextAlignment

2013年ニュース

2012年ニュース

2011年ニュース

2010年ニュース

2009年ニュース

2008年ニュース

2007年ニュース

2006年ニュース

2005年ニュース

2004年ニュース

2003年ニュース

2002年ニュース