我正试图在NSTableView
单元格上的游标“翻转”期间显示“信息”图标。我正在获取单元格图像的副本,在其上绘制“信息”图标,并使用此副本告诉单元格setImage。只绘制图标会缩放它,并且每个图标的大小不同,因为表格中的图像大小不同。我没有缩放或定位正确尺寸图标的问题。
我的问题是被替换的图像略微模糊,并且在仔细检查时它的边缘不清脆。当mouseEntered发生并且图像被替换时,缺少边缘会使它看起来像是“轻微移动”。
我尝试过一些不会在lockFocus
上使用NSImage
的绘图技巧(使用CGBitmapContext
绘图,或使用CIFilter
合成),他们产生相同的结果。
我正在使用NSTableView
的{{1}}因为preparedCellAtColumn
中的绘图似乎无法预测 - 我在某处读到但不记得在哪里。
这是我的 willDisplayCell
方法:
preparedCellAtColumn
[这是scott stevenson所附的缩放方法]
- (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;
}
我需要支持10.6,所以不能使用新的常规狮子方法。
感谢您的考虑......
答案 0 :(得分:0)
您的代码正在将图像的原点设置为非整数坐标。这意味着图像的边缘不会像素对齐,从而产生模糊结果。
你只需要这样做:
NSPoint drawPoint = NSZeroPoint;
drawPoint.x = round((cellSize.width - scaledSize.width) * 0.5);
drawPoint.y = round((cellSize.height - scaledSize.height) * 0.5);
这将确保图像原点没有小数分量。