आनुपातिक रूप से एक UIImageView स्केल कैसे करें?


341

मेरे पास एक UIImageView है और उद्देश्य यह है कि इसे समान रूप से ऊँचाई या चौड़ाई देकर आनुपातिक रूप से घटाया जाए।

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

//Add image view
[self.view addSubview:imageView];   

//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;

छवि को आकार नहीं मिला, लेकिन स्थिति शीर्ष पर नहीं है। स्केलिंग इमेज / छवि दृश्य के लिए सबसे अच्छा तरीका क्या है और मैं स्थिति को कैसे सही करूं?


मेरे पास आपके कोड के समान कुछ है जो मेरे लिए काम नहीं करता है "UIImage * image = [UIImage imageNamed: imageString]; UIImageView * imageView = [[UIImage आवंटन] initWithIstage: image];" एक exeption जो मेरे ऐप को मारता है, इस "व्हाइटिंग ऐप को अनकैप्ड अपवाद 'NSInvalidArgumentException' के कारण समाप्त कर देता है, कारण: '- [UIImage initWithImage:]: unxcognized selector को 0xd815930' के लिए भेजा गया"
Spire

3
@ स्पायर इट्स UIImageView UIImage नहीं ^ ^
थॉमस डेकाक्स

2
यह मेरे लिए काम करता है। अपने UIImageView को .contentMode सेट करना याद रखें - आपका UIImage नहीं। - यहाँ मेरा है: UIImageView * imageView = [[UIImageView आवंटन] initWithFrame: CGRectMake (0,0,30,30)]
जेरेट बार्नेट

जवाबों:


541

एक बार जब मैंने दस्तावेज पाया तो आसानी से तय हो गया!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
आपने वास्तव में क्या उत्तर दिया? रॉनी के सवाल में उन्होंने उल्लेख किया कि वह इसका इस्तेमाल करते हैं
डेजेल

3
हो सकता है कि आपका imageView क्लिपिंग न हो। ImageView.layer.masksToBounds = YES आज़माएं;
मैककवर्थ

मैंने पहली बार आईबी के साथ यह सुनिश्चित करने के लिए प्रयास किया कि यह आवश्यकतानुसार काम करेगा, लेकिन मुझे सेट करने के लिए चर नाम याद नहीं है। इसलिए मैंने इसे गूगल किया और यह जवाब मिला।
डिनो ट्व

1
स्विफ्ट में समान समस्या वाले किसी के लिए: ScaleAspectFitअब एक है enum UIViewContentMode, इसलिए आप सेट करेंगे imageView.contentMode = UIViewContentMode.ScaleAspectFit। अवधि नोट करें।
सुडो

1
translatesAutoresizingMaskIntoConstraintsपर सेट नहीं होना चाहिए false। मुझे यह महसूस करने से पहले एक लंबा समय लग गया कि यह संपत्ति रिसाइज को रोक रही है
गेराल्ड

401

मैंने स्केल प्रकारों के बारे में थोड़ी बातचीत की है इसलिए मैंने कुछ लोकप्रिय सामग्री मोड स्केलिंग प्रकारों के बारे में एक लेख को एक साथ रखने का फैसला किया है ।

संबंधित छवि यहाँ है:

यहां छवि विवरण दर्ज करें


जब AspectFit सेट किया गया है तो आप वर्टिकला कैसे संरेखित करते हैं?
esbenr

@ सेबेनर जो कि स्वचालित रूप से होना चाहिए। आप जरूरत के अनुसार एक ओवरराइड खोजने में सक्षम हो सकते हैं, लेकिन मुझे वर्तमान में किसी का पता नहीं है: |
जैक्सनक्रा

मैं पहलू भरण का उपयोग करना चाहता हूं लेकिन मैं पूरी छवि भी प्रदर्शित करना चाहता हूं। फिर मुझे 'एरिया टू फिट' आकार बदलने की जरूरत है। मैं इसे ऑटो-लेआउट के साथ कैसे कर सकता हूं?
ली

@ हाथ कई विकल्प हैं, लेकिन यह वास्तव में आपकी स्थिति पर निर्भर है। मैंने एक SOF चैट बनाई है, इसलिए हम आपके विषय पर चर्चा कर सकते हैं और मैं आपको वह जानकारी देना चाहता हूँ, जिसके बारे में आप बहुत सोच
जैक्सनक्र

@ जैकसन जो अपने आप नहीं होता है। यह UIImageView के तराजू से पहले मूल छवि की ऊँचाई को चुनता है, इसलिए ऊँचाई नई Aspect पंक्तिबद्ध ऊँचाई से मेल नहीं खाती। अगर किसी को यह करने के लिए एक अच्छा तरीका है, कृपया मुझे बताएं।
datWooWoo

78

मैं सिर्फ यह कोशिश की, और UIImage _imageScaledToSize का समर्थन नहीं करता है।

मैंने एक श्रेणी का उपयोग करके UIImage में एक विधि जोड़ना समाप्त कर दिया - एक सुझाव जो मुझे Apple देव मंचों पर मिला।

परियोजना-व्यापी में -

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

कार्यान्वयन:

@implementation UIImage (Extras)

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

    UIImage *sourceImage = self;
    UIImage *newImage = nil;

    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;

    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;

    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;

    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor < heightFactor) 
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image

        if (widthFactor < heightFactor) {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        } else if (widthFactor > heightFactor) {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;
}

@end;

1
इसके बजाय UIGraphicsBeginImageContext(targetSize);अगर ([UIScreen instancesRespondToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0f); } else { UIGraphicsBeginImageContext(targetSize); }यह धुंधला बनाने के बिना रेटिना डिस्प्ले का समर्थन करने के लिए
साइकिल


30

आप imageViewआकार मिलान बनाने की कोशिश कर सकते हैं image। निम्नलिखित कोड का परीक्षण नहीं किया गया है।

CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height) 
{
    frame.size.width = kMaxImageViewSize.width;
    frame.size.height = frame.size.width / aspectRatio;
} 
else 
{
    frame.size.height = kMaxImageViewSize.height;
    frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;

1
ImageView.frame = XXXX (कुछ भी) सेट करने से आउटपुट में कोई फर्क नहीं पड़ता। किसी भी विचार क्यों?
श्रमिज

1
@sramij यदि आप ऑटोलैयूट का उपयोग कर रहे हैं, तो UIViews पर [setTranslatesAutoResize ...] के साथ गड़बड़ करना सुनिश्चित करें। यदि आप नहीं जानते कि दस्तावेज़ की जाँच क्या है! :)
डेटावू

13

कोई इस तरह UIImage का आकार बदल सकता है

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];

13
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 


//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;

//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);

...

//Add image view
[myView addSubview:imageView]; 

शीर्ष पर पोस्ट किए गए मूल कोड ने आईओएस 4.2 में मेरे लिए अच्छा काम किया।

मैंने पाया कि एक CGRect बनाना और सभी शीर्ष, बाएँ, चौड़ाई और ऊंचाई मान निर्दिष्ट करना मेरे मामले में स्थिति को समायोजित करने का सबसे आसान तरीका था, जो टेबल सेल के अंदर UIImageView का उपयोग कर रहा था। (अभी भी वस्तुओं को जारी करने के लिए कोड जोड़ने की आवश्यकता है)


13

मोड को चुनकर Aspect Fillऔर Clip Subviewsबॉक्स को चेक करके अपना ImageView सेट करें ।

यहां छवि विवरण दर्ज करें


10

यह मेरे लिए ठीक काम करता है स्विफ्ट 2.x:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;



5

UIImageView + Scale.h:

#import <Foundation/Foundation.h>

@interface UIImageView (Scale)

-(void) scaleAspectFit:(CGFloat) scaleFactor;

@end

UIImageView + Scale.m:

#import "UIImageView+Scale.h"

@implementation UIImageView (Scale)


-(void) scaleAspectFit:(CGFloat) scaleFactor{

    self.contentScaleFactor = scaleFactor;
    self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);

    CGRect newRect = self.frame;
    newRect.origin.x = 0;
    newRect.origin.y = 0;
    self.frame = newRect;
}

@end

2

मैंने निम्नलिखित कोड का उपयोग किया। imageCoverView UIView UIImageView रखता है

if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
    [self.profileImageView sizeToFit];
    self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
    self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}

2

यदि यहां प्रस्तावित समाधान आपके लिए काम नहीं कर रहे हैं, और आपकी छवि संपत्ति वास्तव में एक पीडीएफ है, तो ध्यान दें कि एक्सकोड वास्तव में छवि फ़ाइलों की तुलना में पीडीएफ को अलग तरह से व्यवहार करता है। विशेष रूप से, यह एक पीडीएफ के साथ ठीक से भरने के लिए पैमाने पर नहीं दिखता है: यह इसके बजाय टाइलों को समाप्त करता है। यह मुझे पागल कर दिया जब तक मुझे पता नहीं चला कि मुद्दा पीडीएफ प्रारूप था। JPG में कनवर्ट करें और आपको जाना अच्छा होना चाहिए।


1

आमतौर पर मैं अपने ऐप्स के लिए इस विधि का उपयोग करता हूं ( स्विफ्ट 2.x संगत):

// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
    let hasAlpha = true
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return scaledImage
}

0

मुझे लगता है कि आप कुछ ऐसा कर सकते हैं

image.center = [[imageView window] center];

3
यह छवि को स्केल नहीं करेगा बल्कि केवल इसे केंद्र करेगा।
डेविड सैल्जर

-3

यहां बताया गया है कि आप इसे आसानी से कैसे माप सकते हैं।

यह सिम्युलेटर और iPhone के साथ 2.x में काम करता है।

UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];

नमस्ते, क्या आप जानते हैं कि प्रक्षेप क्या है: पैरामीटर क्या करता है? धन्यवाद
user102008

27
यह एक अनिर्धारित विधि है (अंडरस्कोर एक मृत सस्ता है) जिसके परिणामस्वरूप ऐप अस्वीकृति हो सकती है।
झबरा मेंढक

इंटरपोलेशन क्वॉलिटी पैरामीटर क्या करता है?
इंच खोया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.