2012-12-06 14 views
7
Skalierung

Ich versuche, einen einfachen NSImageView mit, um sie anzuzeigen ist zentriert Bild ohne es so Skalierung:Verwirrt über NSImageView

Just like iOS does when you set an UIView's contentMode = **UIViewContentModeCenter**

Genau wie iOS tut, wenn Sie eine UIView des contentMode = gesetzt UIViewContentModeCenter

Also habe ich versucht alle NSImageScaling Werte, ist es das, was ich wenn ich NSScaleNone wählte

I really don't understand what's going on :-/

Ich verstehe wirklich nicht, was los ist: -/

Antwort

0

Um die gewünschten Ergebnisse zu erzielen, wo das Bild in den Blick passen erweitert, Sie müssen NSScaleToFit verwenden. Dadurch wird das Seitenverhältnis des Fotos geändert.

Wenn Sie die äquivalent UIViewContentModeScaleAspectFill wollen, wo das Seitenverhältnis des Bildes gleich gehalten wird, wird das Bild vergrößert den Raum, und seine überquellenden Regionen getrimmt zu füllen, dann ist dieser NSImage Kategorie Kerl check out:

http://rheard.com/blog/making-nsimages-resizable/

Das ist wahrscheinlich, was Sie wollen.

5

Sie können das Bild mit der richtigen Größe und dem richtigen Inhalt manuell erstellen und es als Abbild von NSImageView festlegen, sodass NSImageView nichts tun muss.

Die folgende Funktion ändert die Größe eines Bildes so, dass es der neuen Größe entspricht, wobei das Seitenverhältnis beibehalten wird. Wenn das Bild kleiner als die neue Größe ist, wird es vergrößert und mit dem neuen Bild gefüllt. Wenn das Bild größer als die neue Größe ist, wird es verkleinert, und mit dem neuen Rahmen gefüllt

- (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;} 
+1

Wenn Sie eine mit einigen Seitenverhältnisoptionen möchten: [hier gehen] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m). –

1

Hier ist ein ehrfürchtiges Kategorie für NSImage: NSImage+ContentMode

Es Inhalt Modi erlaubt wie in iOS, funktioniert super.

+0

Ausgezeichnet. Hinweis: Sie müssen 'UIGraphicsGetCurrentContext()' durch '[NSGraphicsContext currentContext] .CGContext' für MacOS ersetzen. Besonders nützlich, nachdem High Sierra den NSAmageView Inhalt während CABasicAnimation vermasselt – codrut

+0

AspectFit funktionierte nicht richtig für mich, wenn h> w. Dies ist, was funktioniert: 'if (contentMode == UIViewContentModeScaleAspectFit) { \t \t \t CGSize imagesize = CGSizeMake (self.size.width, self.size.Höhe); \t \t \t CGSize containerSize = rect.size; \t \t \t \t \t \t CGFloat widthRaport = containerSize.width/imageSize.width; \t \t \t CGFloat heightRaport = containerSize.height/imageSize.height; \t \t \t CGFloat-Skala = MIN (widthRaport, heightRaport); \t \t \t \t \t imageSize.width = imageSize.width * Maßstab; \t \t \t imageSize.height = Bildgröße.Höhe * Maßstab; ' – codrut

1

Setzen Sie die Skalierungseigenschaft des Bildes auf NSImageScaleAxesIndependently, wodurch das Bild zum Füllen des Rechtecks ​​skaliert wird. Dadurch wird das Seitenverhältnis nicht beibehalten.