сбросить изображение в tableView imageCell размыто - PullRequest
0 голосов
/ 22 августа 2011

Я пытаюсь отобразить значок «информация» во время «наведения курсора» на ячейку 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.

спасибо за ваше внимание ...

1 Ответ

0 голосов
/ 23 августа 2011

Ваш код устанавливает начало изображения в нецелые координаты. Это означает, что край изображения не будет выровнен по пикселям, что приведет к нечеткому результату.

Вам просто нужно сделать это:

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

Это обеспечит отсутствие дробного компонента в источнике изображения.

...