मैं UIButton की ImageView को कैसे स्केल करूं?


81

मैंने एक UIButton उदाहरण बनाया जिसका नाम "बटन" है जिसमें एक छवि का उपयोग किया गया है [UIButton setImage:forState:]। बटन.फ्रेम छवि के आकार से बड़ा है।

अब मैं इस बटन की छवि को छोटा करना चाहता हूं। मैंने बदलने की कोशिश की button.imageView.frame, button.imageView.boundsऔर button.imageView.contentMode, सभी अप्रभावी लगते हैं।

क्या कोई मेरी मदद कर सकता है UIButton?

मैंने UIButtonइसे इस तरह बनाया है :

UIButton *button = [[UIButton alloc] init];
[button setImage:image forState:UIControlStateNormal];

मैंने इस तरह से छवि बनाने की कोशिश की:

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.bounds = CGRectMake(0, 0, 70, 70);

और इस:

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.frame = CGRectMake(0, 0, 70, 70);

जवाबों:


90

मूल पोस्टर के लिए, यहाँ मैं हल पाया गया है:

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

यह आपके बटन को क्षैतिज रूप से स्केल करने की अनुमति देगा। एक ऊर्ध्वाधर सेटिंग भी है।

मुझे यह जानने में कई घंटे लग गए कि एक (संपत्ति का नामकरण बहुत ही बेकार है) मुझे लगा कि मैं साझा करूँगा।


अच्छी शर्करा! मेरी समस्या बाईं छवि के बटन के आकार को बदलने के लिए स्ट्रेच की गई छवि पर थी, इसके शीर्षक पर निर्भर करता है।
वलेरी पावलोव

1
यह काम करता है, लेकिन सीमा के बाहर नहीं खींचेगा, यह इस तरह से सोचें कि पाठ को एक पंक्ति में संरेखित करें जैसे कि आपके पास कुछ भी नहीं होगा हाशिये पर। तो, आपको इस एक से UIViewContentModeScaleAspectFill (छवि के कुछ भाग के साथ) जैसा प्रभाव नहीं मिलेगा।
१०:

67

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

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

अपने प्रयोगों के दौरान, मैंने कोशिश की:

button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)

मैंने अपेक्षित परिणाम प्राप्त किया:

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


42

XIB फ़ाइल में कॉन्फ़िगरेशन के लिए एक अतिरिक्त तरीका। आप इस विकल्प को चुन सकते हैं यदि आप टेक्स्ट या इमेज चाहते हैं तो UIButton में स्केल फुल फिल है। यह कोड के साथ समान होगा।

UIButton *btn = [UIButton new];

btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment   = UIControlContentVerticalAlignmentFill;

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


अगर आप UIButton के लिए इमेज को स्ट्रेच करना चाहते हैं तो आप पूरी तरह से इमेज एसेट का सहारा ले सकते हैं और इस इमेज को Slicing कर सकते हैं। developer.apple.com/library/ios/recipes/…
Linh Nguyen

इस विधि के बारे में पता भी नहीं था। रॉक ऑन
माइकल मैककेना

23

उपयोग

button.contentMode = UIViewContentModeScaleToFill;

नहीं

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

अपडेट करें:

जैसा कि @ क्रिस ने टिप्पणी की,

सेटिमेज के लिए काम करने के लिए इसे प्राप्त करने के लिए: forState :, आपको निम्न पैमाने को क्षैतिज रूप से करने की आवश्यकता है: myButton.contentHor क्षैतिजAlignment = UIControlContentHoroubleAlignFill;


3
यह [बटन setBackgroundImage: forState:] के संयोजन में बहुत अच्छा काम करता है। धन्यवाद।
जेसन डेफोंटेस

ध्यान दें कि जेसन ने क्या कहा और आप अच्छे होंगे। यह setImage के लिए काम नहीं करता है : forState:
dpjanes

7
सेटिमेज के लिए काम करने के लिए इसे प्राप्त करने के लिए: forState :, आपको निम्न पैमाने को क्षैतिज रूप से करने की आवश्यकता है: myButton.contentHor क्षैतिजAlignment = UIControlContentHoroubleAlignFill;
क्रिस

15
    UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)];
    button.buttonType = UIButtonTypeCustom;
    UIImage *buttonImage = [UIImage imageNamed:@"image.png"];

    UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
    [button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal]; 

@EEE धन्यवाद। लेकिन 2 समस्याएँ हैं: 1. मेरा प्रश्न UIButton के _imageView चर का उपयोग करता है, न कि _backgroundView चर का। क्या मुझे इसे पृष्ठभूमि के साथ करना है? 2. समारोह [UIImage stretchchableImageWithLeftCapWidth: topCapHeight:] केवल छवि को बड़ा बनाने के लिए कर सकता है, लेकिन छवि को छोटा नहीं कर सकता। सभी को धन्यवाद, और आपका उत्तर मेरे दूसरे प्रश्न को हल करता है: मैं पीछे की छवि के साथ बटन पर एक शीर्षक आकर्षित करना चाहता हूं। मुझे लगता है कि _backgroundImage मेरी मदद कर सकता है। क्या इस सवाल का अन्य बेहतर जवाब है?
vcLwei

मैं देख रहा हूं कि आप क्या करने की कोशिश कर रहे हैं और यह तरीका है। यदि आपकी छवि बड़ी है, तो एक उपकरण का उपयोग करके उसका आकार बदलें, और जो कुछ आप करना चाहते हैं वह सब किया जाएगा। अपना समय with_imageview के साथ बर्बाद न करें। वैसे अगर आप इस asnwer को पसंद करते हैं, तो आप इसे वोट कर सकते हैं, और इसे स्वीकार कर सकते हैं
EEE

आप MacOS में पूर्वावलोकन कार्यक्रम में अपनी छवि का आकार बदल सकते हैं। बस छवि और सेलेट टूल खोलें -> समायोजित करें
EEE

@ ईईई हां, मैं अपनी छवि का उपयोग कर एक उपकरण का आकार बदल सकता हूं। लेकिन मेरे आवेदन में कभी-कभी मुझे बड़ी छवि की भी आवश्यकता होती है, मैं दो समान छवियों को केवल आकार में अंतर नहीं करना चाहता, वह भी बेकार स्थान। और मेरे सवाल को हल करने का एक और तरीका यह है कि मैं एक छोटी छवि प्राप्त करने के लिए CGBitmapContext का उपयोग कर सकता हूं, लेकिन मुझे लगता है कि यह तरीका _imageview का उपयोग करने में असुविधा की तुलना है। जिस कारण से मैंने इसे वोट नहीं दिया वह मेरी प्रतिष्ठा 15 से कम है, वास्तव में मैं वास्तव में ऐसा करना चाहता हूं। धन्यवाद!
vcLwei

10

मुझे इसका हल मिल गया।

1) निम्नलिखित विधियों के उपवर्ग UIButton

+ (id)buttonWithType:(UIButtonType)buttonType {
    MyButton *toReturn = [super buttonWithType:buttonType];
    toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
    return toReturn;
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    return contentRect;
}

और यह अच्छी तरह से काम करता है।


- (CGRect) बैकग्राउंडRectForBounds: (CGRect) बाउंड, बैकग्राउंड इमेज के लिए।
रिकी

9

अजीब बात है, एकमात्र कॉम्बो जिसने मेरे लिए काम किया (आईओएस 5.1) ...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

तथा

[button setImage:newImage forState:UIControlStateNormal];


मूल रूप से मैंने इस्तेमाल किया: बटन। कॉन्टेंटमोड = यूआईवाईवीकॉन्टेंट मेनोडेस्केलस्पॉटफिट; अब मुझे भी बटन लिखना होगा ।imageView.contentMode = UIViewContentModeScaleAspotFit; iPad 3 रेटिना पर पहलू अनुपात रखने के लिए
एनरिको डेटोमा

8

बस करो (डिजाइन या कोड से):

डिजाइन से

  1. अपना xib या स्टोरीबोर्ड खोलें।
  2. बटन का चयन करें
  3. इनसाइड अटेंड इंस्पेक्टर (राइट साइड)> "कंट्रोल" सेक्शन में> हॉरिजॉन्टल और वेरिकल दोनों के लिए अंतिम 4 वां विकल्प चुनें ।

[प्वाइंट # 3 के लिए: क्षैतिज और ऊर्ध्वाधर संरेखित करें UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]

कोड से

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;

7

मैं बस इसी समस्या में भाग गया, और इस सवाल का एक संभावित जवाब है:

इंटरफ़ेस बिल्डर में कस्टम UIButton छवि का आकार परिवर्तन क्यों नहीं होता है?

अनिवार्य रूप से, इसके बजाय पृष्ठभूमि संपत्ति का उपयोग करें, जो छोटा हो जाता है।


5

इस तरह आपकी समस्या का समाधान हो सकता है:

+ (UIImage*)resizedImage:(UIImage*)image
{
 CGRect frame = CGRectMake(0, 0, 60, 60);
 UIGraphicsBeginImageContext(frame.size);
 [image drawInRect:frame];
 UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return resizedImage;
}

5

छोटे परीक्षण से, जो मैंने यहाँ पढ़ने के बाद किया है, यह निर्भर करता है कि क्या आप सेटइमेज या सेटबैकग्राउंड का उपयोग करते हैं, दोनों एक ही परिणाम करते हैं और छवि को स्ट्रेच करते हैं

//for setBackgroundImage
 self.imageButton.contentMode = UIViewContentModeScaleAspectFill;
        [self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

//for setImage
 self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
        self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    [self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

धन्यवाद एक टन ... आकार कम बटन तो बटन आकार की छोटी छवि फिटिंग के लिए सही समाधान ...
फहीम पारकर

4
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;

3

स्टोरीबोर्ड

में आप विशिष्ट संपत्ति को परिभाषित करना होगा रनटाइम गुण की पहचान निरीक्षक - imageView.contentModel, जहाँ आपके लिए अपेक्षाकृत मान सेट rawValueenum की स्थिति UIViewContentMode। 1 का अर्थ है स्केलपेसफिट

Storyboard में Button.imageView.contentMode सेट करें

और बटन के संरेखण, गुण निरीक्षक में :

बटन का पूर्ण संरेखण


2

यह भी काम करेगा, क्योंकि बैकग्राउंडइमेज स्वचालित रूप से स्केल होता है

[button setBackgroundImage:image forState:UIControlStateNormal];


1

मुझे _imageView द्वारा समाधान का उपयोग नहीं मिल सकता है, लेकिन मैं CGContextRefइसे हल करने के लिए उपयोग कर सकता हूं । इसका उपयोग करते हैंUIGraphicsGetCurrentContext currentContextRef पाने के लिए और currentContextRef में एक चित्र बनाने लिए है, और फिर छवि को स्केल या घुमाएँ और एक नई छवि बनाएँ। लेकिन यह सही नहीं है।

कोड:

-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height;
{
    CGImageRef imgRef = photoimage.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);

    bounds.size.width = bounds_width;
    bounds.size.height = bounds_height;

    CGFloat scaleRatio = bounds.size.width / width;
    CGFloat scaleRatioheight = bounds.size.height / height;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = photoimage.imageOrientation;
    switch(orient)
    {
        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"];
            break;
    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft)
    {
        CGContextScaleCTM(context, -scaleRatio, scaleRatioheight);
        CGContextTranslateCTM(context, -height, 0);
    }
    else
    {
        CGContextScaleCTM(context, scaleRatio, -scaleRatioheight);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageCopy;
}

1

मुझे आशा है कि यह किसी और की मदद कर सकता है:

स्विफ्ट 3+

button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment =  UIControlContentVerticalAlignment.fill



-1

हर UIButton का अपना एक छिपा हुआ UIImageView है। इसलिए हमें नीचे दिए गए तरीके की तरह सामग्री मोड सेट करना होगा ...

[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit];
[btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

-1

XCode 8 में स्क्रीनशॉट

स्क्रीनशॉट के नीचे बाईं ओर, आप स्ट्रेचिंग गुण देख सकते हैं। उन का उपयोग करके देखें।

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