Я пытаюсь отобразить значок «информация» во время «наведения курсора» на ячейку NSTableView
.Я получаю копию изображения ячейки, рисую на ней значок «информация» и говорю ячейке установить setImage с этой копией.просто нарисовав иконку, вы масштабируете ее, и она не будет иметь одинаковый размер, так как изображения в таблице имеют разные размеры.У меня нет проблем с масштабированием или позиционированием значка правильного размера.
Моя проблема в том, что замененное изображение слегка размыто , а его края не четкие при ближайшем рассмотрении.отсутствие края делает его слегка «движущимся», когда происходит mouseEntered и изображение заменяется.
Я пробовал несколько методов рисования, которые не используют lockFocus
на NSImage
(рисует 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;
}
[это закрытый метод масштабированияот Скотта Стивенсона]
- (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, поэтому я не могу использовать новые методы Lion Groovy.
спасибо за ваше внимание ...