UIButton कंटेंट मोड सेटिंग को नहीं सुनता है?


91

FirstButton कस्टम का एक UIButton है। मैं प्रोग्रामेटिक रूप से उनमें से तीन को एक टेबल के प्रत्येक सेल में डाल रहा हूँ, इस प्रकार:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

अन्य जगहों पर, मैं इसे क्लिपटॉब के लिए कह रहा हूं। मुझे जो मिलता है वह छवि के केंद्र वर्ग की एक फसल है, बजाय इसके एक पहलू-स्केलिंग प्रदान करने की। मैंने कई तरीकों की कोशिश की है, जिसमें पहले संपत्ति पर मोड संपत्ति सेट करना शामिल है।


1
नीचे क्रिस नोलेट द्वारा समाधान देखें: बटन। कॉन्टेंटवर्टिकल ऑलिग्मेंट = यूआईसीओंट्रोलकेंटेंट वर्टिकल ऑलिगमेंटटॉप;
मैट

देखें stackoverflow.com/a/28205566/481207 जो दिखाता है कि दोनों सामग्री सेट करना UVIVContentModeScaleAspectFit के लिए आवश्यक है।
मैट

जवाबों:


186

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

मुझे खोज और प्रयोग करने में थोड़ा समय लगा, लेकिन मुझे इसका हल मिल गया। बस "छिपे" ImageView के ContentMode को सेट करें जो UIButton के अंदर है।

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

शायद यही है कि डैन रे अपने स्वीकृत जवाब में यह कह रहे थे, लेकिन मुझे संदेह नहीं है।


1
नहीं, यह नहीं था। मैं जिस समाधान पर था, वह छवि को पकड़ने के लिए UIImageView का उपयोग करना था, फिर उसके ऊपर एक स्पष्ट, पारदर्शी UIButton प्रकार "कस्टम"।
डैन रे

डेव, आईओएस 3.2 पर कम से कम, आपका समाधान मेरे लिए काम नहीं करता है। बहुत बुरा है, क्योंकि मैं "मुफ्त के लिए" क्लिक पर छवि का हाइलाइटिंग प्राप्त करने की उम्मीद कर रहा था। मैंने यह भी सुनिश्चित किया कि बटन ।imageView शून्य नहीं था जहाँ मैं contentMode सेट कर रहा था, और सामग्री सेट करने के बाद छवि सेट करें, जैसे आप कर रहे हैं।
जैक्स

2
बस स्पष्ट करने के लिए, "काम नहीं करता है" का अर्थ है "छवि को अपने पूर्ण संकल्प पर दिखाया गया है, न कि नीचे की ओर बढ़ाया जैसा कि मैं उम्मीद कर रहा था"।
जैक्स

जैक्स, उपरोक्त मेरे लिए आईओएस 4.x में काम करता है। दुर्भाग्य से, मैं v3.2 लक्ष्य के साथ निर्माण करते समय "आकार नहीं बदलूंगा" मुद्दे को पुन: पेश कर सकता हूं। मैंने UIButton दृश्य के फ्रेम आकार को बदलने की कोशिश की, लेकिन वह भी मदद नहीं करता था। ओह।
डेव

4
नीचे क्रिस नोलेट द्वारा समाधान देखें: बटन। कॉन्टेंटवर्टिकल ऑलिग्मेंट = यूआईसीओंट्रोलकेंटेंट वर्टिकल ऑलिगमेंटटॉप;
मैट

74

यदि आप UIButton की छवि के साथ काम कर रहे हैं (जैसा कि इसका बैकग्राउंडइमेज है), तो ContentMode को UIButton पर या इसके ImageView पर सेट करने से कोई प्रभाव नहीं पड़ता (इसके बावजूद कि अन्य उत्तर क्या कहते हैं)।

इसके बजाय वैकल्पिक रूप से ऐसा करें:

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

या उसके अनुसार अपनी छवि को आकार दें।

या इसके साथ संलग्न UITapGestureRecognizer या उसके ऊपर एक पारदर्शी UIButton के साथ UIImageView का उपयोग करें (जो कंटेंटमोड का सही तरीके से सम्मान करता है)।


4
यह आईओएस 7 में मेरे मामले के लिए काम करता है जबकि यहां अन्य सभी नहीं है।
बाइट

5
कन्टैंटहोर हॉरिज़ॉन्टल एग्लेन्मेंट और कन्टैंटवर्टिकल ऑलिगमेंट सेट करना सही समाधान है। स्पष्टीकरण के लिए stackoverflow.com/a/28205566/481207 देखें ।
मैट

1
यह उत्तर मैं ढूंढ रहा था।
निन्जानेर

4
यह उत्तर गलत है। आप करते सेट करने की जरूरत है contentModeपर imageViewअगर आप पहलू को भरने या फिट के किसी भी प्रकार क्या करना चाहते हैं, के रूप में अन्य उत्तर स्पष्ट किया है। देखें: stackoverflow.com/a/7944316/746890
क्रिस नोलेट

50

बल्कि स्थापित करने से contentModeबटन पर ही, आप सेट करना चाहते हैं contentHorizontalAlignmentऔर contentVerticalAlignmentगुण और (महत्वपूर्ण) contentModeबटन के लिए imageViewपहलू को भरने या फिट के किसी भी प्रकार के लिए। यहाँ एक उदाहरण है:

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

बेशक, आप अन्य चीजें भी कर सकते हैं जैसे बटन की छवि को बटन के शीर्ष पर संरेखित करना। यदि आपको किसी पहलू को भरने या फिट करने की आवश्यकता नहीं है, तो आप बस संरेखण को स्वयं निर्धारित कर सकते हैं:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

स्विफ्ट में, आप उपयोग करना चाहेंगे:

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

यह iOS के सभी संस्करणों के लिए काम करता है, जिसमें ऑटो-लेआउट के साथ नवीनतम संस्करण शामिल हैं, (यानी iOS 11 से iOS 11+ तक)।


2
धन्यवाद क्रिस - कि मेरी समस्या हल हो गई, या यों कहें, इसने contentEdgeInsets के साथ संयोजन में किया, ताकि मेरी छवि को शीर्ष किनारे से थोड़ी दूर वापस लाया जा सके।
रोब रीस

7

कुछ घंटों की उलझन के बाद, यहां बताया गया है कि IOS 3.2 के तहत काम करने का तरीका मुझे कैसा लगा। जैसा कि डस्ककर ने उल्लेख किया है, setImage के बजाय setBackgroundImage का उपयोग करके मेरे लिए काम किया।

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6

इसका उत्तर UIImageView का उपयोग सभी इच्छित सामग्री मोड सेटिंग्स के साथ करना है, और फिर उसके ऊपर एक कस्टम बटन को परत करना है। गूंगा कि आप एक शॉट में वह सब नहीं कर सकते, लेकिन ऐसा प्रतीत होता है कि आप नहीं कर सकते।


4

इसके लिए एक फिक्स मिला। सेट adjustsImageWhenHighlightedकी संपत्ति UIButtonके लिए NO

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

उम्मीद है की यह मदद करेगा। नीचे टिप्पणी करने के लिए स्वतंत्र महसूस करें, मेरे पास आपके किसी भी प्रश्न का अनुसरण होगा।


यह अचूक उपाय है।
गौरव

काम नहीं करता है। यह केवल बटन को उजागर करने से रोकता है।
मैट

4

मेरा जवाब कुबा के समान है। मुझे अपनी छवि को प्रोग्रामेटिक रूप से सेट करने की आवश्यकता थी।

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}

3

केवल समाधान जो मेरे लिए काम किया:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


1

सेटमैज के बजाय सेटबेकग्राउंडमेज सेट करें


3
HMP। ए, यह गूंगा है, इसे अपने कंटेंट के लिए कंटेंट मोड सेटिंग का सम्मान करना चाहिए, है ना? और B, यह STILL मोड सेटिंग का सम्मान नहीं करता है - यह अब "स्ट्रेच" पर लॉक हो गया है (जो इस मामले में, "निचोड़" की तरह है), और इसके पहलू के संबंध में सामग्री को स्केल नहीं कर रहा है अनुपात।
दान रे

1

मेरा मानना ​​है कि हमारे पास एक सरल इंटरफ़ेस बिल्डर मुद्दा है - जाहिर तौर पर आईबी किसी भी सामग्री-मोड में परिवर्तन को अनदेखा करता है, जब तक कि आपने छवि-संपत्ति सेट नहीं की है।

समाधान सरल है: सामग्री मोड सेट करें, पहले से सेट छवि-नाम हटा दें (सुनिश्चित करें कि आप इसे सभी राज्यों में, डिफ़ॉल्ट, हाइलाइट किए गए आदि हटा दें), फिर सभी वांछित राज्यों में वांछित छवि-नाम फिर से दर्ज करें - et voilà ।


1
वही प्रोग्राम-सेट-कंटेंट-मोड में जाता है - कंटेंट-मोड सेट करने से पहले इमेज सेट न करें
JohnPayne

0

मैं adjustsImageWhenHighlighted UIButtonबटन को दबाए जाने पर छवि के अजीब विकृतियों से बचने के लिए संपत्ति पर एक नज़र रखने की सलाह भी देता हूं ।


0

यह पता लगाने की कोशिश में, समय बीतने के साथ-साथ मेरा तरीका थोड़ा हैकियर हो गया, और मैंने यूबूटन को उपविभाजित कर दिया और सेटहाइगाइड को ओवरराइड किया:

मेरे लिए यह केवल छवि अल्फा को .5 पर दस्तक देने के लिए काम करता है, क्योंकि वे एक काले रंग की पृष्ठभूमि पर हैं।

हालांकि, यह केवल तभी काम करता है जब मैं टिप्पणी करता हूं [सुपर सेटहाईलाइटेड:] (जहां यह प्रतीत होता है कि छवि-खिंचाव कोड चल रहा है), जो कि बस इसे हल करने का सही तरीका नहीं लगता है ... सब कुछ लगता है हालांकि ठीक काम कर रहा है। हम देखेंगे कि मैं इसे कैसे काम करता हूं।

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

1
ऑफ-चांस पर किसी को भी यह प्रासंगिक लगता है, मेरी उपरोक्त विधि ठीक काम करने के लिए लग रही थी जब तक कि मैं बटन को यूआईएसक्रॉल व्यू पर नहीं डालता, जहां कभी-कभी बटन का हाइलाइट "अटक" जाता है, जो कि मुझे संदेह है कि अंततः हो सकता है।
jankins

0

अगर किसी को जवाब की तलाश में है कि आईओएस 6 और आईओएस 7 और स्टोरीबोर्ड में काम करें:

आप अपने स्टोरीबोर्ड में छवि सेट कर सकते हैं:

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

और तब:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

0

यदि UIButton लेआउट बाधा सेटिंग्स को सुनने के लिए प्रतीत नहीं होता है, तो जांचें कि क्या बटन बटन आकार से बड़े हैं। रेटिना प्रस्तावों के लिए हमेशा @ 2x और @ 3x छवियों का उपयोग करें।


0

ये दो चीजें (जो शुरू में खोजने में काफी कठिन हैं) आपकी UIButton की छवि को बटन के आकार में फिट कर देंगी:

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

एक को हमेशा कोड के बजाय स्टोरीबोर्ड में सेट करने का प्रयास करना चाहिए।

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