क्या UIButtons पृष्ठभूमि का रंग बदलना संभव है?


105

इसने मुझे स्टम्प किया है।

क्या iPhone में कोको में UIButton की पृष्ठभूमि का रंग बदलना संभव है। मैंने पृष्ठभूमि का रंग सेट करने की कोशिश की है, लेकिन यह केवल कोनों को बदलता है। setBackgroundColor:इस तरह की चीजों के लिए एकमात्र तरीका उपलब्ध लगता है।

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

क्या आप छवि को ठीक कर सकते हैं, या इसे हटा सकते हैं? ट्वीट में स्थान जोडें;)
stigi

o-0 हम्म्म्म ....., छवि ठीक थी, लेकिन अब यह और नहीं दिखाई देगा। बस इसे हटा दिया
डब की

इस का डुप्लिकेट है stackoverflow.com/questions/372731/...
ब्रैड लार्सन

मैं अपनी प्रीविओस पोस्ट में इस मुद्दे को हल करता हूं कृपया लिंक की जाँच करें [डायनामिक रूप से बॉर्डर या यूआईब्यूटॉन का बैकग्राउंड] [1] [१]: stackoverflow.com/questions/9733213/…
IMMORTIN

अच्छा ट्यूटोरियल और सैंपल कोड यहाँ पाया गया cimgf.com/2010/01/28/…
Shamsudheen TK

जवाबों:


160

यह एक प्रतिकृति बनाकर प्रोग्रामेटिक रूप से किया जा सकता है:

loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
[loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
loginButton.backgroundColor = [UIColor whiteColor];
loginButton.layer.borderColor = [UIColor blackColor].CGColor;
loginButton.layer.borderWidth = 0.5f;
loginButton.layer.cornerRadius = 10.0f;

संपादित करें: बेशक, आपको करना होगा #import <QuartzCore/QuartzCore.h>

संपादित करें: सभी नए पाठकों के लिए, आपको "एक और संभावना" के रूप में जोड़े गए कुछ विकल्पों पर भी विचार करना चाहिए। आपके विचार के लिए।

जैसा कि यह एक पुराना उत्तर है, मैं समस्या निवारण के लिए टिप्पणियों को पढ़ने की जोरदार सलाह देता हूं


यह वही है जो ओपी देख रहा है।
स्टीवन

4
मिठाई! सभी सॉलन में से मैंने पाया कि यह वही है जिसके साथ मैं गया था। स्पष्टीकरण के एक बिंदु के रूप में, एक 'प्रतिकृति' बनाने का मतलब है क्वार्ट्ज का उपयोग करके एक कस्टम बटन में एक गोल आयताकार को आकर्षित करने के बजाय, एक राउंडरेड-प्रकार बटन का उपयोग करना। पहले मुझे लगा कि इसका मतलब है कि किसी तरह एक अलग रंग के साथ एक गोल जड़ का डुप्लिकेट बनाना bg रंग बदलने के लिए अनुकरण करना।
डेव

1
पूरी तरह से काम किया, ओपी के लिए सबसे अच्छा जवाब। साझा करने के लिए धन्यवाद।
ब्रैम

@daver: यह उत्तर इतना लोकप्रिय है कि इसमें योग्यता होनी चाहिए कि मैं गायब हूं। राज्य के अनुसार पृष्ठभूमि का रंग कैसे बदल सकता है? संभवतः हर बार जब राज्य बदलता है तो स्पष्ट रूप से पृष्ठभूमि का रंग बदलना चाहिए। मेरा बटन प्रेस पर तब तक अक्षम रहता है जब तक कि वेब सेवा प्रतिक्रिया न दे। क्या मुझे प्रेस पर रंग को हाइलाइट करने के लिए बदलना चाहिए और डब्ल्यूएस के जवाब के लिए प्रतीक्षा करते समय एक निष्क्रिय रंग में बदलाव करना चाहिए? अगर मुझे वह बात याद आ रही है तो कोई समझा सकता है। धन्यवाद पोली।
पोली

1
@ पॉली: क्षमा करें, आपकी टिप्पणी जल्द नहीं देखी गई, लेकिन यदि आप अभी भी यहां रुचि रखते हैं, तो मैं क्या कर रहा हूं: उप-वर्ग यूआईबूटन और ओवरराइड ड्राअरक्ट: कुछ यूआईबीजियरपैथ का उपयोग करके राउंडेड रूट को आकर्षित करने के लिए। ड्राइंग के बाद, CGGradientCreateWithColorCompords () का उपयोग करके इसे ढाल के साथ भरें। इस कार्य के लिए एक args फ़्लोट्स (आर, जी, बी, और अल्फा के अनुरूप) का एक 4 तत्व सरणी है। मैंने 2 रंग सरणियों को परिभाषित किया है, प्रत्येक राज्य के लिए एक है, और बटन राज्य के आधार पर ड्राअरक्ट में उपयुक्त एक को चुना।
डेवर

59

मेरा एक अलग दृष्टिकोण है,

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

CommonUIUtility से,

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

भूलना मत #import <QuartzCore/QuartzCore.h>


2
अच्छा है। मैंने पाया कि मुझे btFind.layer.borderWidth = 1;
२२:०२ पर

मुझे यह समाधान पसंद है, लेकिन फिलहाल मैं इसका उपयोग नहीं कर सकता। मुझे एक त्रुटि मिलती है, क्योंकि "CommonUIUtility" नहीं मिल सकती है। Google मुझे केवल ग्रहण का सामान देता है, लेकिन मुझे लगता है कि यह क्वार्ट्जकोर में होना चाहिए? कोई विचार?
Stephan

नहीं, यह ऐप में आम यूआई सामान करने के लिए एक उपयोगकर्ता परिभाषित वर्ग है। आप अपने वर्ग में imageFromColor विधि लिखते हैं।
करीम

1
UIButton पर एक श्रेणी विधि की तरह खुशबू आ रही है setBackgroundColor:(UIColor *) forState:(UIControlState):।
एथनब

3
यह इतना मूर्खतापूर्ण है कि हम iOS 7 पर हैं और यह एक पृष्ठभूमि रंग जोड़ने के लिए सबसे साफ तरीका है
dmur

32

मुझे लगता है कि आप एक UIButton के बारे में बात कर रहे हैं UIButtonTypeRoundedRect? आप उस की पृष्ठभूमि का रंग नहीं बदल सकते। जब आप इसे बदलने का प्रयास करते हैं तो यह पृष्ठभूमि का रंग होता है, आप बदले में उस बटन का रंग बदल जाते हैं, जो (आमतौर पर स्पष्ट होता है)। तो दो रास्ते हैं। या तो आप UIButton को उपवर्गित करें और इसके अधिलेखित करें-drawRect: विधि को करते हैं या आप अलग-अलग बटन स्टेट्स के लिए चित्र बनाते हैं (जो करने के लिए पूरी तरह से ठीक है)।

यदि आप इंटरफ़ेस बिल्डर में पृष्ठभूमि चित्र सेट करते हैं, तो आपको ध्यान देना चाहिए कि आईबी उन सभी राज्यों के लिए छवियों को स्थापित करने का समर्थन नहीं करता है जो बटन हो सकते हैं, इसलिए मैं छवियों को इस तरह से कोड में सेट करने की सलाह देता हूं:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

अंतिम पंक्ति बताती है कि चयनित और हाइलाइट किए गए राज्य के लिए छवि कैसे सेट करें (यह वह है जिसे आईबी सेट नहीं कर सकती है)। यदि आपको बटन चयनित राज्य की आवश्यकता नहीं है, तो आपको चयनित छवियों (पंक्ति 4 और 6) की आवश्यकता नहीं है।


समझाने के लिए धन्यवाद। बस एक त्वरित प्रश्न। अगर मैं ड्रॉ सही विधि लिख रहा हूँ तो मुझे लगता है कि मुझे ड्राइंग लाइब्रेरी का उपयोग करना शामिल होगा? अकेले प्रोग्राम की तर्ज पर एक गोल आयताकार रेखा खींचना और इसे एक रंग के साथ भरना?
डब

2
मैंने बस "iphone ड्रॉअर राउंड कॉर्नर" के लिए एक छोटी सी Google क्वेरी की और यह पाया: iphonedevelopment.blogspot.com/2008/11/… एक उदाहरण के लिए ड्राअर विधि की जाँच करें कि एक राउंड रेक्ट कैसे ड्रा किया जाए। आप का उपयोग कर सकते हैं CGContextSetFillColorWithColorऔर CGContextFillPathद्वारा तैयार किए गए पथ को भरने के लिए CGContextAddArcToPoint
10:53

2
नियंत्रण राज्यों के लिए बिटमास्किंग क्षमता को इंगित करने के लिए +50, अर्थात: forState:(UIControlStateHighlighted | UIControlStateSelected)चीयर्स।
NSTJ

28

एक अन्य संभावना:

  1. इंटरफ़ेस बिल्डर में एक UIButton बनाएँ।
  2. इसे एक प्रकार 'कस्टम' दें
  3. अब, आईबी में पृष्ठभूमि का रंग बदलना संभव है

हालाँकि, बटन वर्गाकार है, और यह वह नहीं है जो हम चाहते हैं। इस बटन के संदर्भ के साथ एक IBOutlet बनाएं और निम्नलिखित दृश्य को जोड़ेंवार्ड विधि:

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

QuartzCore.h आयात करना न भूलें


7
पूर्ण धन्यवाद! मुझे यकीन नहीं है कि यह iOS संस्करण (5.1) के उपयोग के कारण है, लेकिन setClipToBounds उपलब्ध नहीं था। इसके बजाय मैंने बटन का उपयोग किया। Oletlet.layer.masksToBounds = TRUE;
iforce2d

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

इस दृष्टिकोण के साथ समस्या यह है कि आप बटन की हाइलाइट की गई स्थिति के लिए पृष्ठभूमि का रंग सेट नहीं कर सकते।
ch3rryc0ke

17

उपवर्ग UIButton और ओवरहाइड किए गए और सेट किए गए तरीकों को ओवरराइड करता है

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

मेरी डार्कशेड विधि इस तरह से एक यूआईसीकलर श्रेणी में है

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}

7

रंगीन UIButton

यदि आप छवियों का उपयोग नहीं करना चाहते हैं, और चाहते हैं कि यह बिल्कुल गोल आयत शैली की तरह दिखे, तो यह प्रयास करें। बस यूआईबीईटी को यूआईब्यूटॉन के ऊपर रखें, एक समान फ्रेम और ऑटो आकार के मुखौटे के साथ, अल्फा को 0.3 पर सेट करें, और पृष्ठभूमि को एक रंग में सेट करें। फिर रंगीन ओवरले दृश्य से गोल किनारों को क्लिप करने के लिए नीचे स्निपेट का उपयोग करें। इसके अलावा, यूआईबीयू पर आईबी में 'यूजर इंटरेक्शन एनेबल्ड एनेबल्ड' चेकबॉक्स को अनचेक करें ताकि टच इवेंट्स को यूआईबीटन के नीचे कैस्केड किया जा सके।

एक साइड इफेक्ट यह है कि आपका टेक्स्ट भी कलर किया जाएगा।

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;

7

एक और संभावना (सबसे अच्छा और सबसे खूबसूरत इम्हो):

इंटरफ़ेस बिल्डर में आवश्यक पृष्ठभूमि रंग में 2 खंडों के साथ एक UISegmentedControl बनाएं। प्रकार को 'बार' पर सेट करें। फिर, इसे केवल एक सेगमेंट में बदल दें। इंटरफ़ेस बिल्डर एक सेगमेंट को स्वीकार नहीं करता है, इसलिए आपको प्रोग्रामेटिक रूप से करना होगा।

इसलिए, इस बटन के लिए एक IBOutlet बनाएं और इसे अपने दृश्य के व्यूडलड में जोड़ें:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

अब आपके पास निर्दिष्ट पृष्ठभूमि रंग के साथ एक सुंदर चमकदार, रंगीन बटन है। क्रियाओं के लिए, 'मूल्य परिवर्तित' घटना का उपयोग करें।

(मैंने इसे http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/ पर पाया है )। धन्यवाद क्रिस!


5

वैसे मैं 99% प्रतिशत सकारात्मक हूं कि आप सिर्फ यूआईब्यूटन की पृष्ठभूमि का रंग नहीं बदल सकते। इसके बजाय आपको स्वयं जाकर पृष्ठभूमि की छवियों को बदलना होगा जो मुझे लगता है कि दर्द है। मैं हैरान हूं कि मुझे ऐसा करना पड़ा।

अगर मैं गलत हूं या अगर पृष्ठभूमि छवियों को सेट किए बिना बेहतर तरीका है तो कृपया मुझे बताएं

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

5
आप बिल्कुल सही कह रहे है। यह एक दर्द है, और कुछ है जो छवियों को बनाने की परेशानी के बजाय कुछ मिनट लेना चाहिए। इसके अलावा अगर आपका बटन गोल है, तो यह और भी कठिन बना देता है ... ऐसा दर्द।
हेनले चिउ

2

@EthanB सुझाव और @Kim के अनुसार एक भरी हुई आयत बनाने के लिए, मैंने इसे प्राप्त करने के लिए सिर्फ UIButton के लिए एक श्रेणी बनाई।

बस श्रेणी कोड में ड्रॉप करें : https://github.com/zmonteca/UIButton-PLColor

उपयोग:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

वैकल्पिक forStates का उपयोग करने के लिए:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

2

आप बटन के लिए एक काइलियर भी जोड़ सकते हैं - आप रंग ओवरले सहित इन के साथ बहुत सारी चीजें कर सकते हैं, यह उदाहरण एक सादे रंग की परत का उपयोग करता है आप आसानी से रंग को स्नातक भी कर सकते हैं। हालांकि पता है कि जोड़ा परतों के नीचे उन अस्पष्ट है

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

}

प्रतिभाशाली!!!!!! लेकिन एक ही बटन के खिलाफ कई बार फोन नहीं किया जा सकता है। सकता है, लेकिन नई परतों को बार-बार जोड़ा जाता है।
वेलेरी वान

@StanJames: कोड का संपादन एक टिप्पणी (या, यदि उपयुक्त हो, अपने स्वयं के उत्तर द्वारा) द्वारा सुझाया जाना चाहिए।
mafso

1

के लिए एक दूसरे लक्ष्य जोड़ने UIButtonके लिए UIControlEventTouchedऔर परिवर्तन UIButtonपृष्ठभूमि रंग। फिर इसे UIControlEventTouchUpInsideलक्ष्य में वापस बदलें ;


1

पेशेवर और अच्छे दिखने वाले बटन के लिए, आप इस कस्टम बटन घटक की जांच कर सकते हैं । आप इसे सीधे अपने विचार और तालिका में उपयोग कर सकते हैं या अपनी आवश्यकताओं को पूरा करने के लिए स्रोत कोड को संशोधित कर सकते हैं। उम्मीद है की यह मदद करेगा।


1

यह UIButton की उप-श्रेणी के रूप में उतना सुंदर नहीं है, हालांकि अगर आप बस कुछ जल्दी चाहते हैं - मैंने क्या किया है तो कस्टम बटन बनाया गया था, फिर 1px की 1px छवि रंग के साथ मैं चाहता हूं कि बटन हो, और पृष्ठभूमि सेट करें हाइलाइट की गई स्थिति के लिए उस छवि का बटन - मेरी जरूरतों के लिए काम करता है।


1

मुझे पता है कि यह एक लंबे समय से पहले पूछा गया था और अब एक नया UIButtonTypeSystem है। लेकिन नए प्रश्नों को इस प्रश्न के डुप्लिकेट के रूप में चिह्नित किया जा रहा है, इसलिए यहां iOS 7 सिस्टम बटन के संदर्भ में मेरा नया उत्तर है, .tintColorसंपत्ति का उपयोग करें ।

let button = UIButton(type: .System)
button.setTitle("My Button", forState: .Normal)
button.tintColor = .redColor()

0

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

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


0

स्विफ्ट 3:

        static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()!
            context.setFillColor(color.cgColor)
            context.fill(rect)
            let img = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
            return img
        }

        let button = UIButton(type: .system)
        let image = imageFromColor(color: .red, width: 
        button.frame.size.width, height: button.frame.size.height)
        button.setBackgroundImage(image, for: .normal)

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