1

一連の変数に値が渡されたときに、添付のリンク(Mac OSXがハードドライブの残りの空き容量に対して表示する)のようなグラフィックを表示する機能をMacOSXアプリに追加したいと考えています。

たとえば、次の値/パーセンテージ(A = 50、B = 20、C = 15、D = 10、E = 5)のAからEまでの5つの変数がある場合、それらの値を表示する方法を学びたいと思います。カラーバーのサイズが値に比例し、凡例も表示されるこの形式でグラフィカルに表示されます。

誰でも提供できるサンプルコードをいただければ幸いです。

4

2 に答える 2

2

解決済み:最終的に、クォーツを使用して描画を行う方法を学ぶことにしました。入力変数の変化に応じてサイズを変更する比例スケーリングされたバーの望ましい結果を達成したので、非常にやりがいがあります。それも非常にカスタマイズ可能です。

これを行う方法を学びたい他の人には、このチュートリアルを強くお勧めします。

于 2012-12-24T11:56:31.520 に答える
0

これを達成するための多くの異なる方法があります。まず、NSBoxオブジェクトを使用して、適切な形状にします。次に、プログラムでさまざまな色を示す画像を作成し、それを別の画像でマスクしてすべてのエッジを切り取ります。次に、ボックス内にNSImageViewを作成し、そこにマスクされた画像を表示します。必要に応じてコードを追加できます。

編集:

いくつかのコード。

2色と透明なレストで構成されたシンプルな静止画を使って試してみました。私はそれを次のようにアウトレットに追加します:

-(void) awakeFromNib{
     NSImage* img = [self maskImage:[NSImage imageNamed:@"Static image from Bundle"] withMask:[NSImage imageNamed:@"Static image mask"]];
    [imgView setImage:img];

}

そして、maskImage:withMask:メソッドは次のようになります。

- (NSImage*) maskImage:(NSImage *)image withMask:(NSImage *)maskImage {
     CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)[maskImage TIFFRepresentation], NULL);
     CGImageRef maskRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, NULL);

     sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)[image TIFFRepresentation], NULL);
     CGImageRef imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, NULL);


     CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);

     CGImageRef masked = CGImageCreateWithMask(imageRef, mask);
     return [[NSImage alloc] initWithCGImage:masked size:NSZeroSize];

}

マスク画像には、NSBoxオブジェクトのサイズのシンプルな白黒フォトショップ画像を使用し、透明になるはずのすべてを黒く塗りつぶしました。このメソッドの唯一の問題は、NSBoxのシャドウがレンダリングされないことです。これを実現するには、マスクにグラデーションを作成する必要があります。これは実際にはかなり簡単なはずです。

私はこれらの写真を使用しています:http://postimage.org/gallery/ertbeca/

ソース画像: http: //postimage.org/image/pdgs4abop/ マスク画像:http://postimage.org/image/54teikcdl/

そしてそれはこのようになってしまいました:http://postimage.org/image/s8tvb5fop/

お役に立てば幸いです。

于 2012-12-10T22:53:43.943 に答える