Można ręcznie wygenerować obraz o odpowiednim rozmiarze i zawartości oraz ustawić go jako obraz NSImageView, tak aby NSImageView nie musiał nic robić.
NSImage *newImg = [self resizeImage:sourceImage size:newSize];
[aNSImageView setImage:newImg];
Następująca funkcja zmienia rozmiar obrazu, aby dopasować go do nowego rozmiaru, zachowując proporcje nienaruszone. Jeśli obraz jest mniejszy niż nowy rozmiar, zostanie powiększony i wypełniony nową ramką. Jeśli obraz jest większy niż nowy rozmiar, to jest zmniejszane, a wypełnione nowej ramce
- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = [[NSImage alloc] initWithSize:size];
NSSize sourceSize = [sourceImage size];
float ratioH = size.height/ sourceSize.height;
float ratioW = size.width/sourceSize.width;
NSRect cropRect = NSZeroRect;
if (ratioH >= ratioW) {
cropRect.size.width = floor (size.width/ratioH);
cropRect.size.height = sourceSize.height;
} else {
cropRect.size.width = sourceSize.width;
cropRect.size.height = floor(size.height/ratioW);
}
cropRect.origin.x = floor((sourceSize.width - cropRect.size.width)/2);
cropRect.origin.y = floor((sourceSize.height - cropRect.size.height)/2);
[targetImage lockFocus];
[sourceImage drawInRect:targetFrame
fromRect:cropRect //portion of source image to draw
operation:NSCompositeCopy //compositing operation
fraction:1.0 //alpha (transparency) value
respectFlipped:YES //coordinate system
hints:@{NSImageHintInterpolation:
[NSNumber numberWithInt:NSImageInterpolationLow]}];
[targetImage unlockFocus];
return targetImage;}
Jeśli chcesz mieć jeden z niektórymi współczynnikami proporcji: [tutaj] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m). –