因爲我還沒有找到任何解決方案來獲取NSImageView中的真實圖像幀,所以我手動進行了圖像計算,考慮了它的所有屬性(縮放,對齊和邊框)。這可能不是最有效的代碼,可能會有0.5-1像素與真實圖像有微小的偏差,但它接近原始圖像(我知道這個問題很老,但解決方案可能會幫助其他人):
@implementation NSImageView (ImageFrame)
// -------------------------------------------------------------------------
// -imageFrame
// -------------------------------------------------------------------------
- (NSRect)imageFrame
{
// Find the content frame of the image without any borders first
NSRect contentFrame = self.bounds;
NSSize imageSize = self.image.size;
NSImageFrameStyle imageFrameStyle = self.imageFrameStyle;
if (imageFrameStyle == NSImageFrameButton ||
imageFrameStyle == NSImageFrameGroove)
{
contentFrame = NSInsetRect(self.bounds, 2, 2);
}
else if (imageFrameStyle == NSImageFramePhoto)
{
contentFrame = NSMakeRect(contentFrame.origin.x + 1,
contentFrame.origin.y + 2,
contentFrame.size.width - 3,
contentFrame.size.height - 3);
}
else if (imageFrameStyle == NSImageFrameGrayBezel)
{
contentFrame = NSInsetRect(self.bounds, 8, 8);
}
// Now find the right image size for the current imageScaling
NSImageScaling imageScaling = self.imageScaling;
NSSize drawingSize = imageSize;
// Proportionally scaling
if (imageScaling == NSImageScaleProportionallyDown ||
imageScaling == NSImageScaleProportionallyUpOrDown)
{
NSSize targetScaleSize = contentFrame.size;
if (imageScaling == NSImageScaleProportionallyDown)
{
if (targetScaleSize.width > imageSize.width) targetScaleSize.width = imageSize.width;
if (targetScaleSize.height > imageSize.height) targetScaleSize.height = imageSize.height;
}
NSSize scaledSize = [self sizeByScalingProportionallyToSize:targetScaleSize fromSize:imageSize];
drawingSize = NSMakeSize(scaledSize.width, scaledSize.height);
}
// Axes independent scaling
else if (imageScaling == NSImageScaleAxesIndependently)
drawingSize = contentFrame.size;
// Now get the image position inside the content frame (center is default) from the current imageAlignment
NSImageAlignment imageAlignment = self.imageAlignment;
NSPoint drawingPosition = NSMakePoint(contentFrame.origin.x + contentFrame.size.width/2.0 - drawingSize.width/2.0,
contentFrame.origin.y + contentFrame.size.height/2.0 - drawingSize.height/2.0);
// NSImageAlignTop/NSImageAlignTopLeft/NSImageAlignTopRight
if (imageAlignment == NSImageAlignTop ||
imageAlignment == NSImageAlignTopLeft ||
imageAlignment == NSImageAlignTopRight)
{
drawingPosition.y = contentFrame.origin.y+contentFrame.size.height - drawingSize.height;
if (imageAlignment == NSImageAlignTopLeft)
drawingPosition.x = contentFrame.origin.x;
else if (imageAlignment == NSImageAlignTopRight)
drawingPosition.x = contentFrame.origin.x + contentFrame.size.width - drawingSize.width;
}
// NSImageAlignBottom/NSImageAlignBottomLeft/NSImageAlignBottomRight
else if (imageAlignment == NSImageAlignBottom ||
imageAlignment == NSImageAlignBottomLeft ||
imageAlignment == NSImageAlignBottomRight)
{
drawingPosition.y = contentFrame.origin.y;
if (imageAlignment == NSImageAlignBottomLeft)
drawingPosition.x = contentFrame.origin.x;
else if (imageAlignment == NSImageAlignBottomRight)
drawingPosition.x = contentFrame.origin.x + contentFrame.size.width - drawingSize.width;
}
// NSImageAlignLeft/NSImageAlignRight
else if (imageAlignment == NSImageAlignLeft)
drawingPosition.x = contentFrame.origin.x;
// NSImageAlignRight
else if (imageAlignment == NSImageAlignRight)
drawingPosition.x = contentFrame.origin.x + contentFrame.size.width - drawingSize.width;
return NSMakeRect(round(drawingPosition.x),
round(drawingPosition.y),
ceil(drawingSize.width),
ceil(drawingSize.height));
}
// -------------------------------------------------------------------------
// -sizeByScalingProportionallyToSize:fromSize:
// -------------------------------------------------------------------------
- (NSSize)sizeByScalingProportionallyToSize:(NSSize)newSize fromSize:(NSSize)oldSize
{
CGFloat widthHeightDivision = oldSize.width/oldSize.height;
CGFloat heightWidthDivision = oldSize.height/oldSize.width;
NSSize scaledSize = NSZeroSize;
if (oldSize.width > oldSize.height)
{
if ((widthHeightDivision * newSize.height) >= newSize.width)
{
scaledSize = NSMakeSize(newSize.width, heightWidthDivision * newSize.width);
} else {
scaledSize = NSMakeSize(widthHeightDivision * newSize.height, newSize.height);
}
} else {
if ((heightWidthDivision * newSize.width) >= newSize.height)
{
scaledSize = NSMakeSize(widthHeightDivision * newSize.height, newSize.height);
} else {
scaledSize = NSMakeSize(newSize.width, heightWidthDivision * newSize.width);
}
}
return scaledSize;
}
@end
我試過了。框架和邊界等都是相對於NSView/NSWindow類型的對象。所以我可以得到視圖或窗口本身的邊界框架......問題是NSImageView並沒有繪製它的所有邊界。部分視圖是空白的。我需要的是NSImageView縮小其圖像的量,或者ImageView實際繪製的邊界矩形(與其擁有的相反) – wrjohns 2012-07-29 19:42:19
現在,我將採用一種解決方法,其中我不允許窗口被調整大小,並從窗口中刪除所有其他UI元素(如標題欄),以便我知道超級視圖邊界= NSImageView邊界=實際圖像的大小。 – wrjohns 2012-07-29 19:44:09
NSImages沒有框架。他們**有**尺寸,但尺寸是全尺寸圖像,而不是實際尺寸。 – wrjohns 2012-07-29 23:09:05