2012-12-06 17 views
7

मैं इसके साथ एक सरल NSImageView प्रदर्शित करने के लिए कोशिश कर रहा हूँ के बारे में उलझन में छवि इस तरह यह स्केलिंग के बिना केंद्रित है: जब आप एक UIView के contentMode = सेटNSImageView स्केलिंग

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

बस आईओएस जैसे करता है UIViewContentModeCenter

तो मैं सब NSImageScaling मूल्यों की कोशिश की है, यह मैं क्या मिलता है जब मैं NSScaleNone

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

चुना है मैं वास्तव में समझ में नहीं आता क्या हो रहा है: -/

उत्तर

0

परिणाम आप चाहते हैं, जहां छवि दृश्य में फिट करने के लिए फैलता है पाने के लिए, आपको NSScaleToFit का उपयोग करना होगा। यह तस्वीर के पहलू अनुपात को बदल देगा।

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

आप बराबर UIViewContentModeScaleAspectFill, जहां छवि के पक्ष अनुपात एक ही रखा जाता है चाहते हैं, छवि जगह को भरने के बढ़े हुए है, और उसके भरे क्षेत्रों छंटनी कर रहे हैं, तो इस लड़के की NSImage श्रेणी की जाँच

शायद यही आप चाहते हैं।

5

आप मैन्युअल रूप से सही आकार और सामग्री की छवि उत्पन्न कर सकते हैं, और इसे NSImageView की छवि के रूप में सेट कर सकते हैं ताकि NSImageView को कुछ भी करने की आवश्यकता न हो।

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

निम्नलिखित फ़ंक्शन नए आकार को फिट करने के लिए एक छवि का आकार बदलता है, पहलू अनुपात को बरकरार रखता है। यदि छवि नए आकार की तुलना में छोटी है, तो इसे बढ़ाया गया है और नए फ्रेम से भरा हुआ है। यदि छवि नया आकार से बड़ा है, यह आकार छोटा है, और नया फ्रेम

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

यदि आप किसी पहलू अनुपात विकल्पों के साथ एक चाहते हैं: [यहां आप जाएं] (https://github.com/spilliams/NSToolkit/blob/master/NSImage%2BResize.m)। –

1

से भर यहाँ NSImage के लिए एक भयानक श्रेणी है: NSImage+ContentMode

यह आईओएस में की तरह सामग्री मोड की अनुमति देता है, महान काम करता है।

+0

उत्कृष्ट। नोट: आपको 'UIGraphicsGetCurrentContext()' को '[NSGraphicsContext CurrentContext] के साथ मैकोज़ के लिए .CGContext' को प्रतिस्थापित करने की आवश्यकता है। उच्च सिएरा के बाद विशेष रूप से उपयोगी सीएबीएसिक एनीमेशन – codrut

+0

के दौरान एनएसआईमेज व्यू सामग्री को गड़बड़ कर दिया गया है जब एच> डब्ल्यू के दौरान AspectFit मेरे लिए सही तरीके से काम नहीं करता है। यह वही काम किया है: 'अगर (contentMode == UIViewContentModeScaleAspectFit) { \t \t \t CGSize imageSize = CGSizeMake (self.size.width, self.size।ऊंचाई); \t \t \t CGSize कंटेनर आकार = 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 scale = MIN (widthRaport, heightRaport); \t \t \t \t \t imageSize.width = imageSize.width * scale; \t \t \t imageSize.height = imageSize.height * scale; ' – codrut

1

एनएसआईमेजस्केलएक्सस पर छवि स्केलिंग गुण सेट करें जो आम तौर पर आयत को भरने के लिए छवि को स्केल करेगा। यह पहलू अनुपात को संरक्षित नहीं करेगा।

संबंधित मुद्दे