पैमाने पर छवि एक UIButton में पहलू को?


94

मैं एक UIButton के लिए एक छवि जोड़ना चाहता हूं, और UIButton के साथ फिट होने के लिए अपनी छवि को स्केल करना चाहता हूं (इसे बहुत छोटा बनाएं)। कृपया मुझे दिखाओ कि यह कैसे करना है।

यह वही है जो मैंने कोशिश की है, लेकिन यह काम नहीं करता है:

  • बटन और उपयोग करने के लिए छवि जोड़ना setContentMode:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
  • "स्ट्रेच इमेज" बनाना:
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];

मुझे लगता है कि यह फर्मवेयर 4.0 और बाद के डिफ़ॉल्ट व्यवहार में बदल दिया गया है।
शॉन बुधराम

1
समाधान के लिए stackoverflow.com/a/28205566/481207 देखें ।
मैट

जवाबों:


28

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

यह वह श्रेणी है जिसका मैं चित्र बनाने के लिए उपयोग कर रहा हूं:

UIImage + Extra.h

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

UIImage + Extra.m

@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)) {

        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:

UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0);

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

आप इसे अपने इच्छित आकार में उपयोग कर सकते हैं। पसंद :

[self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];

आपके उत्तर के लिए धन्यवाद, Gcamp। मेरे पास अनुपात द्वारा आकार देने के लिए एक विधि थी। लेकिन मैं अभी भी UIButton को मेरे लिए यह बताने का एक तरीका खोजने की कोशिश करता हूं। मेरी छवि इंटरनेट से लोड है, इसलिए मैं इसे संकलन समय पर आकार नहीं दे सकता। BTW, आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद।
काँग

2
क्योंकि छवि को एक क्वार्टर में रखा गया है, जिसे क्वार्ट्ज द्वारा प्रस्तुत, और कैश किया गया है, यदि आप इसे पूर्ण आकार में रखते हैं तो प्रदर्शन कोई भी बदतर नहीं होना चाहिए। किसी भी तरह से, आप ~ 1 बार आकार बदल रहे हैं। यदि आप लगातार बटन का आकार बदल रहे हैं या अन्य चीजें कर रहे हैं जो छवि परत को फिर से शुरू करने के लिए क्वार्ट्ज को ट्रिगर करेगी तो gcamp का उत्तर अधिक महत्वपूर्ण है।
बेन गोटोव

ऐसा लगता है जैसे छवि गुणवत्ता कम हो गई है। मैं iPhone 6 प्लस पर परीक्षण कर रहा हूं। क्या यह सच है? मेरी भी 3x प्रतिमा है।
खांत थू लिन

हाँ यह होगा, यह कोड बहुत पुराना है। इसके UIGraphicsBeginImageContextबजाय था UIGraphicsBeginImageContextWithOptions। बस इसे ठीक कर दिया।
gcamp

हाँ, लेकिन कई मामलों में यह मायने नहीं रखता है अगर आप कुछ चक्रों को ढीला करते हैं, तो राम को भरने का कोई मतलब नहीं है
रादु सिमियोनेस्कु

203

मुझे भी यही समस्या थी। UIButton के अंदर ImageView का ContentMode सेट करें।

[[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];

उम्मीद है की यह मदद करेगा।


14
सुनिश्चित करें कि आप imageView सेट कर रहे हैं । मैं नोटिस करने में भी विफल रहा, एक बिट के लिए, कि मैं अभी भी बैकग्राउंड का उपयोग कर रहा था I दृश्य और यह उसके लिए काम नहीं कर रहा था।
एलेक्जेंडर गोम्स

2
ऐसा लगता है कि इस विधि में कुछ समस्याएं हैं जब बटन स्थिति 'हाइलाइटेड' है। छवि भरण मोड में वापस आ जाएगी। कोई उपाय?
युआनफेई झू

यह मेरे लिए काम नहीं कर रहा है। हालाँकि, मैं इसे [self.itemImageButton setbackgroundImage: [UIImage imageNamed: stretchImage] forState: UIControlStateNormal] का उपयोग करके काम करता हूँ;
मिकी

3
इसने मेरे लिए काम किया। मैंने सामग्री मोड को ऊपर के रूप में सेट किया है। हालाँकि, आपको "फ़िल मोड" पर वापस जाने वाली छवि से बचने के लिए हाइलाइटेड स्थिति की समान छवि सेट करने की भी आवश्यकता है। उदाहरण के लिए, [imageButton setImage: image forState: UIControlStateHighlighted];
क्रिस्टोफर

1
आप इसे इंटरफ़ेस बिल्डर में मुख्य पथ imageView.contentMode, प्रकार Number, और मूल्य1
bendytree

107

यहां कोई भी उत्तर वास्तव में मेरे लिए काम नहीं किया, मैंने निम्नलिखित कोड के साथ समस्या को हल किया:

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

आप इसे इंटरफ़ेस बिल्डर में भी कर सकते हैं।

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


5
यह आपको ओपी द्वारा पूछे गए पहलू के अनुकूल व्यवहार नहीं देता है ।
ऑर्टविन Gentz

3
@ ऑर्टविनगेंट्ज़ आप मोड का चयन कर सकते हैं और Aspect fitइसके बजाय सेट कर सकते हैं scale to fill
डैनियल

55

प्रोग्राम फिट मोड में UIButton imageView को प्रोग्रामेटिक रूप से सेट करने का सबसे आसान तरीका :

तीव्र

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

उद्देश्य सी

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

नोट: आप .scaleAspectFit (UIViewContentModeScaleAspectit) को .scaleAspectFill (UIViewContentModeScaleAspectFill) में एक भरण मोड सेट करने के लिए बदल सकते हैं।


20

मुझे छवि के साथ समस्याएँ समानुपातिक रूप से आकार नहीं देने की थी इसलिए मैंने तय किया कि यह एज इनसेट का उपयोग कर रहा है।

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

16

यह अब IB के UIButton गुणों के माध्यम से किया जा सकता है। कुंजी आपकी छवि को पृष्ठभूमि के रूप में सेट करना है, अन्यथा यह काम नहीं करेगा।

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


14

डेव के जवाब पर विस्तार करते हुए, आप बिना किसी कोड के, बिना किसी कोड के, रबीटाइम एट्रीब्यूट्स का उपयोग करते हुए, आईबी में contentModeबटन के imageViewसभी सेट कर सकते हैं :

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

  • 1का अर्थ है UIViewContentModeScaleAspectFit,
  • 2मतलब होगा UIViewContentModeScaleAspectFill

8

यदि आप अपनी बटन छवि को कम करना चाहते हैं:

yourButton.contentMode = UIViewContentModeScaleAspectFit;
yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);

वह आपका बटनटन होना चाहिए।
sdsykes

.ImageView के साथ प्रयास नहीं किया। यह बहुत अच्छी तरह से बिना काम कर रहा है।
तुललेब

5

1 - स्पष्ट बटन डिफ़ॉल्ट पाठ (महत्वपूर्ण)

2 - छवि की तरह संरेखण सेट करें

3 - सेट सामग्री मोड छवि की तरह

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


अच्छा जवाब भाई..मेरे लिए बहुत कुछ। धन्यवाद!
भरथराओ

5

मेरे पास एक तरीका है जो मेरे लिए करता है। विधि UIButtonछवि पहलू को लेता है और फिट बनाता है।

-(void)makeImageAspectFitForButton:(UIButton*)button{
    button.imageView.contentMode=UIViewContentModeScaleAspectFit;
    button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill;
}

4

सबसे साफ उपाय ऑटो लेआउट का उपयोग करना है । मैंने अपनी सामग्री संपीड़न प्रतिरोध प्राथमिकता को कम किया UIButtonऔर इंटरफ़ेस बिल्डर के माध्यम से छवि ( पृष्ठभूमि छवि नहीं ) सेट की । उसके बाद मैंने कुछ बाधाओं को जोड़ा, जो मेरे बटन के आकार को परिभाषित करती हैं (मेरे मामले में काफी जटिल) और इसने एक आकर्षण की तरह काम किया।


यह मेरे लिए काम करता है - लेकिन केवल अगर मैंने "पृष्ठभूमि छवि" का उपयोग करने के लिए चुना, न कि वास्तविक छवि। जो कुछ भी काम करता है! यह मुझे NUTS चला रहा था।
एंडी

Xcode 6.2 के तहत यह मेरे लिए काम करता था, लेकिन @AndrewHeinlein ने कहा, जैसेBackground Image
RoLYroLLs

3

सुनिश्चित करें कि आपने छवि को छवि संपत्ति में सेट किया है, लेकिन पृष्ठभूमि पर नहीं


2

पृष्ठभूमि छवि वास्तव में बड़े पैमाने पर आसानी से भरने के पैमाने पर सेट की जा सकती है। बस कुछ ऐसा करने की जरूरत है UIButton के एक उपवर्ग में:

- (CGRect)backgroundRectForBounds:(CGRect)bounds
{
    // you'll need the original size of the image, you 
    // can save it from setBackgroundImage:forControlState
    return CGRectFitToFillRect(__original_image_frame_size__, bounds);
}

// Utility function, can be saved elsewhere
CGRect CGRectFitToFillRect( CGRect inRect, CGRect maxRect )
{
    CGFloat origRes = inRect.size.width / inRect.size.height;
    CGFloat newRes = maxRect.size.width / maxRect.size.height;

    CGRect retRect = maxRect;

    if (newRes < origRes)
    {
        retRect.size.width = inRect.size.width * maxRect.size.height / inRect.size.height;
        retRect.origin.x = roundf((maxRect.size.width - retRect.size.width) / 2);
    }
    else
    {
        retRect.size.height = inRect.size.height * maxRect.size.width / inRect.size.width;
        retRect.origin.y = roundf((maxRect.size.height - retRect.size.height) / 2);
    }

    return retRect;
}

यह एक उपवर्ग के बिना संभव नहीं है?
इयूलियन ओनोफ्रेई

यह उत्तर विशेष रूप से बैकग्राउंडइमेज के लिए था। मुख्य छवि के लिए आप imageEdgeInsets के साथ बंदर कर सकते हैं।
एंडी पोस

मुझे पता है, और मैं चाहता था कि अगर यह एक उपवर्ग के बिना इसे प्राप्त करना संभव है।
इलियान ओनोफ्रेई

जहाँ तक मुझे पता है, आप उपअभ्यास के बिना पृष्ठभूमि को समायोजित नहीं कर सकते।
एंडी पोस


0

Xamarin.iOS (C #) के लिए:

    myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill;
    myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill;
    myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;

-1

आपको केवल तीन घटनाओं के लिए यूआईब्यूटॉन इमेजव्यू के कंटेंट मोड सेट करने की आवश्यकता है। -

[cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];

[cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateHighlighted];

[cell.imgIcon setImage:[UIImage imageWithData:data] forState:UIControlStateSelected];

हाइलाइट करते समय या चयन करते समय हमारे पास तीन ईवेंट bcoz के लिए कोड है यदि बटन का आकार SQUARE है और छवि का आकार आयत है तो यह हाइलाइटिंग या चयन के समय वर्ग छवि दिखाएगा।

मुझे यकीन है कि यह आपके लिए काम करेगा।


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