UIImageView पहलू फिट और केंद्र


183

मेरे पास एक छवि दृश्य है, जिसे प्रोग्रामेटिक रूप से घोषित किया गया है, और मैं इसकी छवि सेट कर रहा हूं, वह भी प्रोग्रामेटिक रूप से।

हालाँकि, मैं अपने आप को छवि को देखने और पहलू को फिट करने के लिए छवि दृश्य को संरेखित करने में असमर्थ पाता हूँ।

दूसरे शब्दों में, मैं चाहता हूं कि छवि:

  • पहलू को फिट करने के लिए नीचे स्केल करें, अगर छवि बड़ी है।
  • अगर छवि छोटी है, तो केंद्र नहीं, बल्कि पैमाना।

मुझे वह कैसे मिलेगा?


19
[yourImageView setContentMode: UIViewContentModeCenter]; और सुनिश्चित करें कि imageView फ़्रेम छवि फ़्रेम से अधिक है। यदि यह तब नहीं है तो [yourImageView setContentMode: UIViewContentModeAspectToFit];
मनोहर परेरा

1
if अदर कंडीशन डिड @RyanPoolos
मनोहर परेपा

जवाबों:


205

बस समाधान चिपकाया:

जैसे @ मनोहर ने कहा

imageView.contentMode = UIViewContentModeCenter;
if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
       imageView.contentMode = UIViewContentModeScaleAspectFit;
}

मेरी समस्या हल कर दी


7
छवि को खोजने के लिए छोटा रास्ता छोटा है:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@ यह शायद छोटा है, लेकिन इतना पठनीय नहीं है। : एक ही समय में मैं इस तरह अगर बयान के साथ लाइन विभाजित करने का प्रस्ताव CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {
तैमूर बर्निकोविच

1
होना चाहिए UIViewContentModeScaleAspectFit
NoelHunter

imageView.contentMode = UIViewContentModeScaleAspectFit;
अर्जुन वारन

75

तेज भाषा में हम UIImage के कंटेंट मोड को निम्नानुसार सेट कर सकते हैं:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit

3
यह छवि को उड़ा देता है यदि यह छवि दृश्य से छोटा है, तो इसके विपरीत जो ओपी ने पूछा था।
मछुआरा

18

तीव्र

yourImageView.contentMode = .center

अपनी छवि की स्थिति के लिए आप निम्न विकल्पों का उपयोग कर सकते हैं:

  • scaleToFill
  • scaleAspectFit // सामग्री निश्चित पहलू के साथ फिट करने के लिए बढ़ाया। शेष पारदर्शी है
  • redraw // सीमा परिवर्तन पर redraw (कॉल -NNsDisplay)
  • center// सामग्री एक ही आकार की रहती है। समायोजित किया गया।
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

अद्यतन उत्तर

जब मैंने मूल रूप से 2014 में इस प्रश्न का उत्तर दिया था, तो एक छोटी छवि के मामले में छवि को स्केल करने की आवश्यकता नहीं थी। (प्रश्न 2015 में संपादित किया गया था ।) यदि आपके पास ऐसी आवश्यकता है, तो आपको वास्तव में छवि के आकार की तुलना imageView से करनी होगी और या तो उपयोग करना होगा UIViewContentModeCenter(छवि से छोटा चित्र के मामले में) या UIViewContentModeScaleAspectFitअन्य सभी मामलों में ।

मूल उत्तर

ImageView की सामग्री को सेट करना UIViewContentModeScaleAspectFitमेरे लिए पर्याप्त था। यह छवियों को भी केंद्र में रखता है। मुझे यकीन नहीं है कि अन्य लोग छवि के आधार पर तर्क का उपयोग क्यों कर रहे हैं। इस सवाल को भी देखें: iOS पहलू फिट और केंद्र


1
यह छवि को उड़ा देता है यदि यह छवि दृश्य से छोटा है, तो इसके विपरीत जो ओपी ने पूछा था।
मछुआरा

1
@fishinear छवि को स्केल न करने के बारे में आवश्यकता को प्रश्न के एक साल बाद जोड़ा गया जब मैंने इसका उत्तर दिया: stackoverflow.com/posts/15499376/revisions
Nate Cook

10

मैंने इस समस्या को इस तरह हल किया।

  1. के साथ सेट करें UIImageView(साथ UIViewContentModeScaleAspectFit)
  2. चित्र प्राप्त करें (CGSize imageSize = imageView.image.size)
  3. UIImageView आकार बदलें। [imageView sizeThatFits:imageSize]
  4. वह स्थान जहाँ आप चाहते हैं।

मैं UIView को शीर्ष केंद्र पर रखना चाहता था UICollectionViewCell। इसलिए, मैंने इस फ़ंक्शन का उपयोग किया।

- (void)setImageToCenter:(UIImageView *)imageView
{
    CGSize imageSize = imageView.image.size;
    [imageView sizeThatFits:imageSize];
    CGPoint imageViewCenter = imageView.center;
     imageViewCenter.x = CGRectGetMidX(self.contentView.frame);
    [imageView setCenter:imageViewCenter];
}

इससे मेरा काम बनता है।


8

यह उपवर्ग केंद्र का उपयोग करता है अगर छवि दृश्य से बड़ी नहीं है, अन्यथा यह नीचे तराजू है। मैंने पाया UIImageViewकि आकार में परिवर्तन के लिए यह उपयोगी है ।

यह प्रदर्शित होने वाली छवि बड़े आकार के लिए दृश्य से छोटी है, लेकिन छोटे आकार के लिए दृश्य से बड़ी है। मैं चाहता हूं कि यह केवल नीचे पैमाने पर हो, लेकिन ऊपर नहीं।

class CenterScaleToFitImageView: UIImageView {
    override var bounds: CGRect {
        didSet {
            adjustContentMode()
        }
    }

    override var image: UIImage? {
        didSet {
            adjustContentMode()
        }
    }

    func adjustContentMode() {
        guard let image = image else {
            return
        }
        if image.size.width > bounds.size.width ||
            image.size.height > bounds.size.height {
            contentMode = .ScaleAspectFit
        } else {
            contentMode = .Center
        }
    }
}

8

आप UIViewContentModeScaleAspectFill में छवि दृश्य की सामग्री मोड सेट करके इसे प्राप्त कर सकते हैं।

फिर आकार बदलने वाली वस्तु प्राप्त करने के लिए निम्न विधि विधि का उपयोग करें।

- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView
{
    CGFloat width = imageToResize.size.width;
    CGFloat height = imageToResize.size.height;
    float scaleFactor;
    if(width > height)
    {
        scaleFactor = imageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = imageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0);
    [imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return resizedImage;
}

यहाँ संपादित (स्विफ्ट संस्करण)

func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage
{
    let width = imageToResize.size.width
    let height = imageToResize.size.height

    var scaleFactor: CGFloat

    if(width > height)
    {
        scaleFactor = onImageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = onImageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0)
    imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor))
    let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return resizedImage;
}

7
[your_imageview setContentMode:UIViewContentModeCenter];

17
यह स्केलिंग को नजरअंदाज कर देगा
Skrew

2
मुझे नहीं पता कि इस तरह के समाधान इतने सारे उठाव क्यों हुए। इस व्यक्ति ने स्पष्ट रूप से प्रश्न को बिल्कुल नहीं पढ़ा।
धीमी

7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);

यह छवि को उड़ा देता है यदि यह छवि दृश्य से छोटा है, तो इसके विपरीत जो ओपी ने पूछा था।
मछुआरे का

2

UIImage का आकार बदलने वाले लोगों के लिए,

@implementation UIImage (Resize)

- (UIImage *)scaledToSize:(CGSize)size
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    [self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (UIImage *)aspectFitToSize:(CGSize)size
{
    CGFloat aspect = self.size.width / self.size.height;
    if (size.width / aspect <= size.height)
    {
        return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
    } else {
        return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
    }
}

- (UIImage *)aspectFillToSize:(CGSize)size
{
    CGFloat imgAspect = self.size.width / self.size.height;
    CGFloat sizeAspect = size.width/size.height;

    CGSize scaledSize;

        if (sizeAspect > imgAspect) { // increase width, crop height
            scaledSize = CGSizeMake(size.width, size.width / imgAspect);
        } else { // increase height, crop width
            scaledSize = CGSizeMake(size.height * imgAspect, size.height);
        }
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
    [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

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