2012-12-06 13 views
7

Próbuję wyświetlić proste NSImageView z jego obraz skupia bez skalowania to tak:Confused o NSImageView skalowania

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

Podobnie jak iOS czy po ustawieniu UIView za contentMode = UIViewContentModeCenter

Więc próbowałem wszystkie NSImageScaling wartości, to co mam kiedy wybrałem NSScaleNone

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

I naprawdę nie rozumiem, co się dzieje: -/

Odpowiedz

0

Aby uzyskać pożądane wyniki, gdzie obraz rozszerza się być stworzony do widzenia musisz użyć NSScaleToFit. Spowoduje to zmianę współczynnika kształtu zdjęcia.

Jeśli chcesz odpowiednik UIViewContentModeScaleAspectFill, gdzie proporcje obrazem przechowywany jest taka sama, obraz jest powiększany w celu wypełnienia przestrzeni, a jego przepełnione regiony są przycinane, a następnie sprawdzić ten facet kategorię NSImage:

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

To prawdopodobnie chcesz.

5

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

Jeśli chcesz mieć jeden z niektórymi współczynnikami proporcji: [tutaj] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m). –

1

Oto niesamowite kategoria dla NSImage: NSImage+ContentMode

Pozwala tryby treści jak w iOS, działa świetnie.

+0

Doskonały. Uwaga: należy zastąpić 'UIGraphicsGetCurrentContext()' z '[NSGraphicsContext currentContext] .CGContext' for MacOS. Szczególnie przydatny, gdy High Sierra zawalił zawartość NSImageView podczas CABasicAnimation – codrut

+0

AspectFit nie działał poprawnie, gdy h> w. To właśnie pracował: 'if (contentMode == UIViewContentModeScaleAspectFit) { \t \t \t CGSize ImageSize = CGSizeMake (self.size.width, self.size.wysokość); \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 Skala CGFloat = MIN (widthRaport, heightRaport); \t \t \t \t \t \t imageSize.width = imageSize.width * scale; \t \t \t imageSize.height = imageSize.height * skala; ' – codrut

1

Ustaw właściwość skalowania obrazu na NSImageScaleAxesIndependently, która skaluje obraz w celu wypełnienia prostokąta.To nie zachowuje proporcji.