我試圖在光標「翻轉」期間在NSTableView
單元格中顯示「信息」圖標。我得到了單元格圖像的副本,在其上繪製'info'圖標,並告訴單元格使用此副本的setImage。只是繪製圖標會縮放它,並且每張圖片的大小不一樣,因爲表格中的圖片大小不同。我沒有遇到縮放或定位正確大小圖標的問題。在tableView中重置圖像imageCell模糊
我的問題是,置換後的圖像稍微模糊,它的邊緣仔細觀察不脆。當mouseEntered發生並且圖像被替換時,缺少邊緣使得它看起來「稍微移動」。
我已經嘗試了許多繪圖技術,doen't上NSImage
(在CGBitmapContext
拉絲,或使用CIFilter
合成)使用lockFocus
,並且它們產生相同的結果。
我使用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,所以不能用常規的新獅子的方法。
感謝您的參與......
謝謝,羅布。奇怪的是,這適用於縮放以適合單元格高度的圖像,但對於比高度更小但填滿寬度的縮放圖像,「模糊」仍然存在。我正在回答這個問題,因爲我認爲它指出了另一個問題,這可能與查看原點座標和縮放比例有關,這將是一個不同的問題。 – lulu