2011-08-22 7 views
0

NSTableView 셀에서 '롤오버'커서가있는 동안 '정보'아이콘을 표시하려고합니다. 셀의 이미지 사본을 가져오고, '정보'아이콘을 그려서 셀에이 사본으로 setImage를 알려줍니다. 아이콘 만 그려서 크기를 조정하면 테이블의 이미지 크기가 달라서 모든 아이콘이 같은 크기가되지 않습니다. 나는 크기를 조정하거나 올바른 크기의 아이콘을 배치하는 데 문제가 없습니다.tableView에서 이미지 재설정 imageCell이 흐림

내 문제는 교체 된 이미지가 다소 흐릿이며, 그것의 가장자리가 정밀 검사에 선명하지 을 점이다. 가장자리가 없으므로 mouseEntered가 발생하고 이미지가 바뀌면 약간 움직이는 것처럼 보입니다.

난 (CGBitmapContext 그리기 또는 합성 CIFilter 사용)에 NSImagelockFocus를 사용 doen't 도면 다수의 기술을 시도한, 그들은 동일한 결과를 생성한다.

willDisplayCell에 그리기 예측할 수없는 것 같습니다으로 나는 NSTableViewpreparedCellAtColumn을 사용하고 있습니다 - 어디 선가 읽을 수 있지만 위치를 기억 할 수 없다. 여기

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; 
} 

[이 스캇 스티븐슨에서 동봉 스케일링 방법] 내가 10.6을 지원해야

- (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); 

} 

, 그래서 끝내 새 사용할 수 없습니다 사자 방법. 당신의 고려

덕분에 ...

답변

0

귀하의 코드가 아닌 정수 좌표에 이미지의 출처를 설정하는 것입니다. 즉, 이미지의 가장자리가 픽셀 정렬되지 않고 퍼지 결과가 생성됩니다.

당신은이 작업을 수행 할 필요가 : 이미지의 출처를 보장합니다

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

에는 분수 구성 요소가 없습니다.

+0

감사합니다. Rob. 기이하게도이 방법은 셀의 높이에 맞게 크기가 조정 된 이미지에서 작동하지만 높이보다 작지 만 너비를 채우는 크기 조정 된 이미지의 경우 '흐림'이 여전히 존재합니다. 나는 이것이 다른 문제를 지적하고 있다고 생각하기 때문에이 점을 표시하고 있습니다. 뷰 원점 좌표와 스케일링과는 다른 문제가 될 수 있습니다. – lulu