0

NSTableViewセルのカーソル「ロールオーバー」中に「情報」アイコンを表示しようとしています。セルの画像のコピーを取得し、その上に「情報」アイコンを描画し、セルにこのコピーで setImage を指示しています。アイコンを描画するだけで拡大縮小され、テーブル内の画像のサイズが異なるため、すべてのアイコンが同じサイズになるわけではありません。正しいサイズのアイコンのスケーリングまたは配置に問題はありません。

私の問題は、置き換えられた画像がわずかにぼやけており、よく見るとエッジが鮮明ではないことです。エッジがないため、mouseEntered が発生して画像が置き換えられたときに、わずかに「動いている」ように見えます。

lockFocusで使用しない多くの描画テクニックNSImage( .draw での描画CGBitmapContext、またはCIFilter合成の使用) を試しましたが、同じ結果が得られました。

描画が予測できないように見えるので、を使用しています。どこかで読んだNSTableViewのですが、どこか思い出せません。preparedCellAtColumnwillDisplayCell

ここに私のpreparedCellAtColumn方法があります:

- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row
{
        NSCell *cell = [super preparedCellAtColumn:column row:row];

        if ((self.mouseOverRow == row) && column == 0) {

            NSCell * imageCell = [super preparedCellAtColumn:0 row:row];

            NSImage *sourceImage = [[imageCell image] copy];        
            NSRect cellRect = [self frameOfCellAtColumn:0 row:row];
            NSSize cellSize = cellRect.size; 

            NSSize scaledSize = [sourceImage proportionalSizeForTargetSize:cellSize];

            NSImage *outputImage = [[NSImage alloc] initWithSize:cellSize];
            [outputImage setBackgroundColor:[NSColor clearColor]];

            NSPoint drawPoint = NSZeroPoint;
            drawPoint.x = (cellSize.width - scaledSize.width) * 0.5;
            drawPoint.y = (cellSize.height - scaledSize.height) * 0.5;

            NSRect drawRect = NSMakeRect(drawPoint.x, drawPoint.y, scaledSize.width, scaledSize.height);

            NSPoint infoPoint = drawPoint;
            infoPoint.x += NSWidth(drawRect) - self.infoSize.width;

            [outputImage lockFocus]; 
            [sourceImage drawInRect:drawRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
            [self.infoImage drawAtPoint:infoPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
            [outputImage unlockFocus];

            [cell setImage:outputImage];
        }

        return cell;
}

[これは scott stevenson による同封のスケーリング方法です]

- (NSSize)proportionalSizeForTargetSize:(NSSize)targetSize
{
    NSSize imageSize = [self size];
    CGFloat width  = imageSize.width;
    CGFloat height = imageSize.height;

    CGFloat targetWidth  = targetSize.width;
    CGFloat targetHeight = targetSize.height;

    CGFloat scaleFactor  = 0.0;                
    CGFloat scaledWidth  = targetWidth;
    CGFloat scaledHeight = targetHeight;

    if ( NSEqualSizes( imageSize, targetSize ) == NO )
    {    
        CGFloat widthFactor;
        CGFloat heightFactor;

        widthFactor  = targetWidth / width;
        heightFactor = targetHeight / height;

        if ( widthFactor < heightFactor )
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;

        scaledWidth  = width  * scaleFactor;
        scaledHeight = height * scaleFactor;
    }

    return NSMakeSize(scaledWidth,scaledHeight);

}

10.6 をサポートする必要があるため、新しい groovy ライオン メソッドを使用できません。

ご検討いただきありがとうございます...

4

1 に答える 1