アプリケーションのタブの実装に取り組んでいます。ウィンドウがメインステータスを辞任するときに、タブを明るい灰色の色合いで描画する方法がわからないことを除いて、すべてがうまく機能しています。NSWindowDidBecomeMainNotification を正常に受け取り、タブ バーを再描画していますが、タブの新しい灰色を計算する方法がわかりません。現在、すべての描画に画像を使用しています。タブバー全体の上に半透明のレイヤーを描画して軽くしようとしましたが、うまくいかないようでした。使用する画像ごとに不透明度の値を設定することもできますが、それは理想的とは言えません。これに関するAppleのドキュメントにも情報が見つかりませんでした。この場合のベストプラクティスは何ですか?
3 に答える
できることは、コードでタブを描画し、背景を描画しないことです。アクティブまたは非アクティブなウィンドウの背景が透けて見えるようにします。
PSMTabBarControlに切り替えることも検討してください。これは、既に作成され、いくつかのアプリで使用されている再利用可能なタブ バー クラスです。(そして、NSTabView は目的の外観ではないとして却下したと思います。)
非アクティブなコントロールを行う方法は、グラフィックプログラム(PhotoshopまたはIllustrator)で同じグラフィックの非アクティブな状態のバージョンをレンダリングし、必要に応じて非アクティブなバージョンを描画することです。アクティブな画像の50%透明バージョンを描画する場合は、最初に背景色で消去する必要があります。
半透明のマスクを使って画像を描いてみることができます。私が一般的に使用するコードは、単純に画像を描画してから、Quartz の透明レイヤー機能を使用して、画像の実際の境界を四角形で塗りつぶします。私はこれを NSImage のカテゴリとして行います:
@implementation NSImage (ShadedImageAddition)
- (void)drawAtPoint:(NSPoint)point shadeWithColor:(NSColor *)color intensity:(CGFloat)alpha
{
NSRect imageRect;
CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
imageRect.origin = point;
imageRect.size = [self size];
CGContextBeginTransparencyLayerWithRect(context, NSRectToCGRect(imageRect), NULL);
[self drawInRect:imageRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[[color colorWithAlphaComponent:alpha] setFill];
NSRectFillUsingOperation(imageRect, NSCompositeSourceAtop);
CGContextEndTransparencyLayer(context);
}
@end
次に、非キー ウィンドウに画像を描画する場合、通常は 50% で白いマスクを描画します。もちろん、ビットマップに適した色とアルファ値を選択する必要があります。
[myImage drawAtPoint:NSZeroPoint shadeWithColor:[NSColor whiteColor] intensity:0.50];