NSTableView
セルのカーソル「ロールオーバー」中に「情報」アイコンを表示しようとしています。セルの画像のコピーを取得し、その上に「情報」アイコンを描画し、セルにこのコピーで setImage を指示しています。アイコンを描画するだけで拡大縮小され、テーブル内の画像のサイズが異なるため、すべてのアイコンが同じサイズになるわけではありません。正しいサイズのアイコンのスケーリングまたは配置に問題はありません。
私の問題は、置き換えられた画像がわずかにぼやけており、よく見るとエッジが鮮明ではないことです。エッジがないため、mouseEntered が発生して画像が置き換えられたときに、わずかに「動いている」ように見えます。
lockFocus
で使用しない多くの描画テクニックNSImage
( .draw での描画CGBitmapContext
、またはCIFilter
合成の使用) を試しましたが、同じ結果が得られました。
描画が予測できないように見えるので、を使用しています。どこかで読んだNSTableView
のですが、どこか思い出せません。preparedCellAtColumn
willDisplayCell
ここに私の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 ライオン メソッドを使用できません。
ご検討いただきありがとうございます...