2

このコードスニペットを使用します...

[[textField cell] setBackgroundStyle:NSBackgroundStyleLowered];

...テキストの一部に影を付けると、うまくいきます。ボタンで同じことをしようとすると:

[[refreshButton cell] setBackgroundStyle:NSBackgroundStyleLowered];

コードが機能しません。ボタンは、白い透明な円形の矢印が付いた一時的な変更ボタンです。これが機能しない理由はありますか?まだ細胞なので、うまくいきそうです。

4

1 に答える 1

2

NSCell サブクラスの描画動作は異なります。したがって、設定可能な背景スタイルは、そのスタイルが具体的なサブクラスで実際に使用されることを意味しません。

NSButtonCells は、タイトルを描画する前にinteriorBackgroundStyleプロパティを使用します。このプロパティはセッターを公開しないため、NSButtonCell をサブクラス化し、それに応じて Interface Builder でセル クラスを設定する必要があります。
低い背景スタイルを実現するには、サブクラスで interiorBackgroundStyle をオーバーライドします。

- (NSBackgroundStyle)interiorBackgroundStyle
{
    return NSBackgroundStyleLowered;
}

描画をさらに制御する必要がある場合は、NSButtonCell のdrawInteriorWithFrame:inView:をオーバーライドすることもできます。

ハックなアプローチ (サブクラス化を必要としない) は、属性付きのタイトル文字列を変更して、同様の効果を達成することです。

NSShadow* shadow = [[NSShadow alloc] init];
[shadow setShadowOffset:NSMakeSize(0,-1)];
[shadow setShadowColor:[NSColor whiteColor]];
[shadow setShadowBlurRadius:0];
NSAttributedString* title = [button.cell attributedTitle];
NSMutableDictionary* attributes = [[title attributesAtIndex:0 longestEffectiveRange:NULL inRange:NSMakeRange(0, title.length)] mutableCopy];
[attributes setObject:shadow forKey:NSShadowAttributeName];
NSAttributedString* string = [[NSAttributedString alloc] initWithString:[button.cell title] attributes:attributes];
[button.cell setAttributedTitle:string];
于 2013-04-03T08:51:58.937 に答える