2011-08-22 37 views
0

我試圖在光標「翻轉」期間在NSTableView單元格中顯示「信息」圖標。我得到了單元格圖像的副本,在其上繪製'info'圖標,並告訴單元格使用此副本的setImage。只是繪製圖標會縮放它,並且每張圖片的大小不一樣,因爲表格中的圖片大小不同。我沒有遇到縮放或定位正確大小圖標的問題。在tableView中重置圖像imageCell模糊

我的問題是,置換後的圖像稍微模糊,它的邊緣仔細觀察不脆。當mouseEntered發生並且圖像被替換時,缺少邊緣使得它看起來「稍微移動」。

我已經嘗試了許多繪圖技術,doen't上NSImage(在CGBitmapContext拉絲,或使用CIFilter合成)使用lockFocus,並且它們產生相同的結果。

我使用NSTableViewpreparedCellAtColumn,因爲它似乎在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,所以不能用常規的新獅子的方法。

感謝您的參與......

回答

0

您的代碼圖像的原點設置非整數座標。這意味着圖像的邊緣將不會像素對齊,從而產生模糊結果。

你只需要做到這一點:

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

這將確保圖像原點沒有小數部分。

+0

謝謝,羅布。奇怪的是,這適用於縮放以適合單元格高度的圖像,但對於比高度更小但填滿寬度的縮放圖像,「模糊」仍然存在。我正在回答這個問題,因爲我認爲它指出了另一個問題,這可能與查看原點座標和縮放比例有關,這將是一個不同的問題。 – lulu