2009-08-05 12 views
15

यहाँ है कि कैसे मैं पृष्ठभूमि छवि और सामग्री मोड सेट हूँ:जब UIButton सामग्री विधा है "केंद्र," पृष्ठभूमि छवि pixelated

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
       forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 

वहाँ एक कारण यह है कि पृष्ठभूमि छवि pixelated किया जाएगा है? फ्रेम छवि आकार से थोड़ा बड़ा है, और मैं बस छवि को केंद्रित करना चाहता हूं।

+1

क्षमा करें, के हर छवियों के लिए एक ही है कि ऊपर खींचें करने के लिए समय की गहराई से है, लेकिन वहाँ में एक स्मृति रिसाव है, अगर मैं गलत नहीं हूँ। आवंटन के लिए कोई रिलीज नहीं। –

+0

@ जोसेफ, यह इंगित करने के लिए धन्यवाद। मैंने कोड अपडेट किया। –

उत्तर

25

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

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 
+2

इस समाधान के साथ समस्या यह है कि UIButton में आंतरिक मार्जिन होता है, इसलिए यदि छवि पर्याप्त छोटा नहीं है तो यह फसल हो जाएगी, भले ही यह बटन के अंदर फिट हो। –

+3

सामग्री मोड सेट करना वास्तव में यहां कुछ भी नहीं कर रहा है।बटन छवियों को स्वचालित रूप से केंद्रित किया जाता है और स्केल नहीं किया जाता है। इसे केंद्रित करने के अलावा इसे किसी भी चीज़ पर सेट करने का प्रयास करें और देखें कि मेरा क्या मतलब है। –

+2

+1 हालांकि, दुर्भाग्य से यदि आप पाठ के साथ-साथ एक छवि भी चाहते हैं तो यह काम नहीं करेगा :-( – Marc

5

तुम भी - (CGRect)backgroundRectForBounds:(CGRect)bounds को लागू कर सकता है कैसे पृष्ठभूमि तैयार की है नियंत्रित करने के लिए।

+3

यह मेरे लिए काम करता है। मैं एक कस्टम UIButton वर्ग बना देता हूं, और मैंने इस कोड का उपयोग छवि को केंद्र में करने के लिए किया था: '- (सीजीईजीईटी) backgroundRectForBounds: (CGRect) सीमा { \t UIImage * bkgImage = [आत्म backgroundImageForState: self.state]; \t अगर (bkgImage) { \t \t CGFloat एक्स = floorf ((self.bounds.size.width-bkgImage.size। चौड़ाई)/2); \t \t CGFloat y = floorf ((self.bounds.size.height-bkgImage.size.height)/2); \t \t वापसी CGRectMake (x, y, bkgImage.size.width, bkgImage.size.height); \t} \t अन्यथा वापस लौटें [सुपर पृष्ठभूमिरेक्टफोरबाउंड्स: सीमाएं]; } ' –

+0

" ओवरकिल "समाधान आईएमओ। आप बस बटन के लिए फ्रेम सेट कर सकते हैं जैसे: UIImage * img = [UIImage imageNamed: @ "dots_game_horiz_blue.png"]; [बीटीएन सेटबैकग्राउंड इमेज: आईएमजी फॉरस्टेट: यूआईसींट्रोलस्टेट नॉर्मल]; btn.frame = CGRectMake (0, 0, img.size.width, img.size.height); – Tony

0

मुझे अवतार फ़ोटो के लिए गोलाकार बटन बनाने की आवश्यकता थी और मदद के लिए इस प्रश्न का उत्तर मिला लेकिन वे मुझे वहां से सभी तरह से नहीं मिला। मैंने backgroundRectForBounds विधि लागू की और छवि को फिट करने के लिए स्केल किया और यह अच्छी तरह से काम करता है।

मेरे पास गिटहब पर कोड है।

https://github.com/brennanMKE/CircleButton

विधि भी नीचे सूचीबद्ध है। पृष्ठभूमि छवि को सेट करना महत्वपूर्ण है, न कि बटन के लिए छवि जो इस विधि के साथ काम नहीं करता है।

- (CGRect)backgroundRectForBounds:(CGRect)bounds { 
    UIImage *backgroundImage = [self backgroundImageForState:self.state]; 
    if (backgroundImage) { 
     CGFloat maxWidth = CGRectGetWidth(self.frame); 

     CGFloat xDelta = maxWidth/backgroundImage.size.width; 
     CGFloat yDelta = maxWidth/backgroundImage.size.height; 
     CGFloat delta = xDelta > yDelta ? xDelta : yDelta; 

     CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta))/2); 
     CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta))/2); 

     return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta); 
    } 
    else { 
     return [super backgroundRectForBounds:bounds]; 
    } 
} 
1

सही समाधान सिस्टम से कस्टम में प्रकार को बदलने का सही समाधान है। फिर पृष्ठभूमि छवि केवल केंद्र के बजाय सामग्री प्रकार का सम्मान करेगी। मेरे मामले में मैंने इसे पहलू भरने के लिए सेट किया और इसे गोल करने के लिए 45 डिग्री कोने त्रिज्या लागू किया। सरल और पूरी तरह से काम करता है।

+0

यह काम नहीं करता है। मैंने एक नया कस्टम बटन बनाया और केंद्र में अपना कंटेंट मोड सेट किया, लेकिन यह अभी भी पृष्ठभूमि छवि को दृश्य के आकार में भर देता है। – devios1

11

अपने xib/स्टोरीबोर्ड में, गुण निरीक्षक में, आप की जरूरत है:

  1. Custom करने के लिए अपने UIButton प्रकार सेट
  2. संपत्ति Image में अपनी छवि सेट, Background
  3. चरण 2 सत्यापित किया जा रहा नहीं , आप छवि सेट के अनुसार बटन फ्रेम बदल सकते हैं। अवधि सेट के रूप में आप यह होना चाहता हूँ, स्वयं छवि आदेश बटन छवि
  4. इनसेट मूल्यों की जरूरत दर्ज करने के लिए इनसेट लागू करने के लिए आकार बदलने संपत्ति Edge के लिए
  5. करें Image में फिट करने के लिए होगा। आप Top, Bottom, Left, Right को 5 सेट करते हैं, छवि बटन के केंद्र में आ जाएगा, 5

की एक सीमा के साथ आप एक डिबग शुरू करने की कोई जरूरत नहीं xib/स्टोरीबोर्ड दृश्य में परिवर्तन देख सकते हैं।

युक्ति: इनसेट बटन (State Config)

+1

'आपके xib/storyboard' में शुरू होने वाली कोई भी चीज़ इस प्रश्न का समाधान नहीं है: डी – Magoo

+0

अब तक, समाधान विकसित हुआ। आप चरण 4 को छोड़ सकते हैं और आकार निरीक्षक (नियम आइकन) के माध्यम से चरण 5 के साथ जा सकते हैं। –

संबंधित मुद्दे