UIButton iPhone में पहलू फिट पर नहीं जाएगा


105

मेरे पास कुछ UIButtons हैं, और IB में वे पहलू फिट पर सेट हैं, लेकिन किसी कारण से वे हमेशा खींच रहे हैं। क्या आपको कुछ और सेट करना है? मैंने सभी अलग-अलग व्यू मोड की कोशिश की और उनमें से कोई भी काम नहीं करता, वे सभी खिंचाव करते हैं।


@Werner Altesischer का उत्तर सही है। उचित बदलाव करें।
हर्षित गुप्ता

1
@ मार्टी आप बैकग्राउंड इमेज या इमेज सेट कर रहे हैं? पृष्ठभूमि छवि केवल छवि का समर्थन नहीं करती है।
जुआन बोइरो

जवाबों:


45

मुझे वह समस्या पहले भी हो चुकी है। मैंने इसे अपनी छवि को एक में डालकर हल किया UIImageView, जहां contentModeसेटिंग्स वास्तव में काम करती हैं, और UIButtonउस के ऊपर एक पारदर्शी कस्टम लगा रही हैं ।

EDIT: यह उत्तर अप्रचलित है। IOS के आधुनिक संस्करणों में सही उत्तर के लिए @Werner Altewischer का उत्तर देखें ।


हाँ की कोशिश की है, लेकिन अब छवि को परिष्कृत करने के लिए बटन नहीं मिल सकता है
मार्टी

आप इस तकनीक के साथ बटन राज्यों का प्रबंधन कैसे करते हैं? लगता है कि "हाइलाइट" जैसे उपयोगकर्ता इंटरैक्शन पर प्रतिक्रिया देना बुरा सपना होगा।
सूडेसुएन

3
यह 2.5 साल पहले ऐसा करने का सही तरीका हो सकता है जब इस प्रश्न का उत्तर दिया गया था, लेकिन अब आप UIButton के आंतरिक ImageView को संपादित कर सकते हैं और वहां सामग्री मोड सेट कर सकते हैं। १२:५४ बजे @erner Altewischer
स्टीव हेली

233

का समाधान संपत्ति contentModeपर सेट करना imageViewहै UIButtonUIButton(अन्यथा यह मेरा मानना है कि काम करने के लिए के लिए कस्टम प्रकार के साथ निर्मित होता है nilइस संपत्ति के लिए दिया जाता है)।


67
इसने मेरे लिए काम किया:[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
ayreguitar

2
यह मेरे लिए भी काम करता है, लेकिन अगर मैं समायोजन सेट करता हूं। तबहेनहाइगेड = हाँ, छवि को फिर से बढ़ाया जाता है जब मैं बटन पर टैप करता हूं।
cduck

1
एडजस्टमेंट में खिंचाव को iOS 6 में खत्म कर दिया गया है
बेन फ्लिन

3
IOS 8 में, यह वास्तव में मेरे लिए काम नहीं करता है। मूल उत्तर (पारदर्शी बटन के पीछे एक छवि दृश्य रखने के साथ) सबसे अच्छा काम करता है।
user1416564 12

3
स्विफ्ट डू पत्रिकाओं में:button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
नेस्टर

57

यह विधि मेरे लिए बहुत अच्छा काम करती है।

में xib बटन और सेट का चयन करें user defined runtime attributes:

  • मुख्य पथ: self.imageView.contentMode
  • प्रकार: Number
  • मान: 1

अधिक स्पष्ट रूप से समाधान देखने के लिए यहां क्लिक करें

हम संख्या का उपयोग करते हैं क्योंकि आप वहां enum का उपयोग नहीं कर सकते। लेकिन UIViewContentModeScaleAspectFit 1 के बराबर है।


2
इसने डिज़ाइनर समय के दौरान इंटरफ़ेस बिल्डर में छवि को भी अपडेट किया। महान समाधान।
जॉर्ज फिलिप्पोस

महान समाधान, कुछ कोड और एक आकर्षण की तरह काम करता है, एनम सामग्री मोड सूची आइटम पर आधारित है।
क्रोस

आप इसे थोड़ा आसान बनाने के लिए एक एक्सटेंशन भी जोड़ सकते हैं: extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
योनाट

बिना Without स्व ’ imageView.contentModeने मेरे लिए काम किया!
जीवन

22

यदि आप इंटरफ़ेस बिल्डर में ऐसा कर रहे हैं, तो आप इसे बिना किसी कोड के सीधे सेट करने के लिए रनटाइम विशेषताओं निरीक्षक का उपयोग कर सकते हैं।

"ImageView.contentMode" को "नंबर" और "1" (या जो भी आप चाहेंगे मोड) का मान के साथ बटन पर अपना मुख्य पथ सेट करें।

imageview.contentMode = 1


14

सामग्री के लिए बटन का उपयोग करें ImageView सामग्री। सीधे बटन पर ही नहीं।

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];

6

यदि आप छवि UIImageViewको बटन के पीछे रखते हैं, तो आप UIButtonकक्षा की अंतर्निहित कार्यक्षमता को ढीला कर देंगे , जैसे कि adjustsImageWhenHighlightedऔर adjustsImageWhenDisabled, और निश्चित रूप से अलग-अलग राज्यों के लिए अलग-अलग छवियां सेट करने की क्षमता (यह खुद करने की ललक के बिना)।

यदि हम सभी नियंत्रण अवस्थाओं के लिए एक छवि खोलना चाहते हैं , तो एक approuch का उपयोग करके छवि प्राप्त करना है imageWithCGImage:scale:orientation, जैसा कि निम्नलिखित विधि में है:

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

इसे लागू करने के लिए हम लिखेंगे:

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

यह सभी नियंत्रण राज्यों में छवि को फैलने से रोकना चाहिए। यह मेरे लिए काम किया है, लेकिन मुझे पता है अगर यह नहीं करता है!

नोट: यहां हम एक समस्या से संबंधित है UIButton, लेकिनinsideButton: जैसा भी हो insideView:, या जो कोई भी छवि में फिट करना चाहेगा।


6

मुझे कुछ समय पहले यह समस्या हुई थी। मेरे पास जो मुद्दा था, मैं इस आशय की पृष्ठभूमि UIButton पर लागू करने की कोशिश कर रहा था जो कि सीमित है और इसलिए इसका मतलब है कि आप इसे आसानी से समायोजित नहीं कर सकते।

चाल सिर्फ एक छवि के रूप में सेट करने के लिए है तो @ ayreguitar की तकनीक को लागू करें और इसे ठीक करना चाहिए!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

4

इसने मेरे लिए काम किया

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

उनकी टिप्पणी के लिए @ayreguitar को धन्यवाद



4

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

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)

3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;

हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। - समीक्षा से
फेरीबिग

2

यह उत्तर @ WernerAltewischer के उत्तर पर आधारित है ।

इस पर कोड निष्पादित करने के लिए एक IBOutlet से मेरे बटन को जोड़ने से बचने के लिए, मैंने UIButton की कक्षा को उप-वर्गित किया:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



अब अपने xib में एक कस्टम बटन बनाएं, और उसकी छवि सेट करें (पृष्ठभूमि छवि नहीं):

UIButtonWithImageAspectFit: छवि बनाएं और सेट करें


फिर, इसकी कक्षा निर्धारित करें:

UIButtonWithImageAspectFit: कस्टम वर्ग सेट करें

हो गया! आपके बटन के
बजाय
छवि पहलू के बिना UIButton फिट
छवि का पहलू अब अपेक्षित है:
छवि पहलू के साथ UIButton फिट


2

ios 12. आपको सामग्री संरेखण को भी जोड़ना होगा

class FitButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)


    }

    override func layoutSubviews() {
        self.imageView?.contentMode = .scaleAspectFill
        self.contentHorizontalAlignment = .fill
        self.contentVerticalAlignment = .fill
        super.layoutSubviews()


    }

}

1

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

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

1

UIView कंटेंट मोड्स संबंधित CALayer के "कंटेंट" पर लागू होते हैं। यह UIImageViews के लिए काम करता है क्योंकि वे CALayerसामग्री को संबंधित पर सेट करते हैं CGImage

drawRect: अंत में परत सामग्री को प्रदान करता है।

एक कस्टम UIButton(जहां तक ​​मुझे पता है) की कोई सामग्री नहीं है (सामग्री का उपयोग करके गोल-रेक्ट स्टाइल बटन को प्रस्तुत किया जा सकता है)। बटन में साक्षात्कार होते हैं: पृष्ठभूमि UIImageView, छवि UIImageViewऔर शीर्षक UILabelcontentModeसबव्यू पर सेट करना आप जो चाहते हैं वह कर सकते हैं, लेकिन UIButtonदृश्य पदानुक्रम के साथ खिलवाड़ करना थोड़ा नहीं के बराबर है।


1

बदलना UIButton.imageView.contentModeमेरे लिए काम नहीं करता।
मैंने इमेज को 'बैकग्राउंड' प्रॉपर्टी में सेट करके समस्या हल की।
जरूरत पड़ने पर आप अनुपात की कमी जोड़ सकते हैं


1

यह कई अन्य उत्तरों को ओवरलैप करता है, लेकिन मेरे लिए समाधान था

  • बटन contentModeके UIImageViewलिए सेट .ScaleAspectFit- जो या तो "यूजर डिफाइंड रनटाइम अटेंशन" में किया जा सकता है इंटरफ़ेस बिल्डर (यानी self.imageView.contentMode; नंबर, 1) या एक UIButtonउपवर्ग में;
  • अक्षम करें "ऑटोबॉइसेज़ साक्षात्कार";
  • "इनसेट" के लिए "एज" और "इनसेट" के लिए उपयुक्त "टॉप" और "बॉटम" वैल्यूज़ सेट करें (जो कि केवल तभी आवश्यक हो सकती है, जब आप, मेरी तरह, इमेज के रूप में एक पीडीएफ का उपयोग करें)।

0

जैसा कि ऊपर दिखाया गया है (लेकिन लापता कोष्ठक के बिना) आप imageWithCGImage का उपयोग कर सकते हैं।

इसके अलावा ... लाखों गैर 4.0 फोन उस कोड के साथ बिल्कुल भी काम नहीं करेंगे।



0

@ गिलुय्यूम के समान, मैंने स्विफ्ट-फाइल के रूप में यूबूटन का उपवर्ग बनाया है। फिर इंटरफ़ेस बिल्डर में मेरी कस्टम क्लास सेट करें:

इंटरफ़ेस बिल्डर

और यहां स्विफ्ट फ़ाइल:

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}

-1

मेरे पास एक ही मुद्दा था, लेकिन मैं इसे काम करने के लिए नहीं मिला (शायद यह एसडीके के साथ एक बग है)।

आखिरकार, वर्कअराउंड के रूप में, मैंने UIImageViewअपने बटन के पीछे रखा और उन विकल्पों को सेट किया जो मैं चाहता था, फिर बस उसके UIButtonऊपर एक रिक्त स्थान रखा ।


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