2012-12-06 1 views
7

Sto cercando di visualizzare un semplice NSImageView con la sua immagine centrata, senza ridimensionamento in questo modo:Confuso su NSImageView ridimensionamento

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

Proprio come iOS fa quando si imposta di un UIView contentMode = UIViewContentModeCenter

Così ho provato tutte le NSImageScaling valori, questo è ciò che ottengo quando ho scelto NSScaleNone

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

Io davvero non capisco cosa sta succedendo: -/

risposta

0

Per ottenere i risultati desiderati, in cui l'immagine si espande per adattarsi la vista, devi usare NSScaleToFit. Questo cambierà le proporzioni della foto.

Se si desidera che l'equivalente UIViewContentModeScaleAspectFill, dove le proporzioni dell'immagine viene mantenuto lo stesso, l'immagine viene ingrandita per riempire lo spazio, e le sue regioni traboccanti vengono tagliati, quindi controllare di questo ragazzo categoria NSImage:

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

Questo è probabilmente quello che vuoi.

5

È possibile generare manualmente l'immagine della dimensione e del contenuto corretti e impostarla come immagine di NSImageView in modo che NSImageView non debba eseguire alcuna operazione.

NSImage *newImg = [self resizeImage:sourceImage size:newSize]; 
[aNSImageView setImage:newImg]; 

La seguente funzione ridimensiona un'immagine per adattarla alla nuova dimensione, mantenendo intatto il rapporto di aspetto. Se l'immagine è più piccola della nuova dimensione, viene ridimensionata e riempita con la nuova cornice. Se l'immagine è più grande della nuova dimensione, viene ridimensionato, e riempito con il nuovo telaio

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

Se desideri uno con alcune opzioni di proporzioni: [qui vai] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m). –

1

Ecco una categoria impressionante per NSImage: NSImage+ContentMode

Permette modalità di contenuti come in iOS, grandi opere.

+0

Eccellente. Nota: è necessario sostituire 'UIGraphicsGetCurrentContext()' con '[NSGraphicsContext currentContext] .CGContext' per MacOS. Particolarmente utile dopo High Sierra incasinato il contenuto NSImageView durante CABasicAnimation – codrut

+0

AspectFit non ha funzionato correttamente per me quando h> w. Questo è ciò che ha funzionato: 'if (contentMode == UIViewContentModeScaleAspectFit) { \t \t \t CGSize ImageSize = CGSizeMake (self.size.width, self.size.altezza); \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 CGScala in scala = MIN (larghezzaRaporto, altezzaRaporto); \t \t \t \t \t \t imageSize.width = imageSize.width * scala; \t \t \t imageSize.height = imageSize.height * scale; ' – codrut

1

Imposta la proprietà di ridimensionamento dell'immagine su NSImageScaleAxesIndependent che ridimensiona l'immagine in modo da riempire il rettangolo. Non conserverà le proporzioni.