हाइलाइट करते समय UIButton की पृष्ठभूमि का रंग कैसे बदलें?


236

मेरे ऐप में कुछ बिंदु पर मैंने एक हाइलाइट किया है UIButton (उदाहरण के लिए जब किसी उपयोगकर्ता की बटन पर उंगली होती है) और मुझे बटन को हाइलाइट करते समय पृष्ठभूमि का रंग बदलने की आवश्यकता होती है (इसलिए उपयोगकर्ता की उंगली अभी भी बटन पर है) ।

मैंने निम्नलिखित कोशिश की:

_button.backgroundColor = [UIColor redColor];

लेकिन यह काम नहीं कर रहा है। रंग वही रहता है। जब बटन हाइलाइट न हो और मैंने ठीक काम किया हो, तो मैंने उसी कोड के कोड की कोशिश की। मैंने भी फोन करने की कोशिश की-setNeedsDisplay रंग बदलने के बाद करने , इसका कोई असर नहीं हुआ।

पृष्ठभूमि का रंग बदलने के लिए बटन को कैसे मजबूर करें?


इस पोस्ट की जाँच करें somethingaboutios.wordpress.com/2016/02/09/... और इस फली github.com/GabrielMassana/ButtonBackgroundColor-iOS
Gabriel.Massana

जवाबों:


411

आप ओवरराइड कर सकते हैं UIButtonकीsetHighlighted विधि।

उद्देश्य सी

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = UIColorFromRGB(0x387038);
    } else {
        self.backgroundColor = UIColorFromRGB(0x5bb75b);
    }
}

स्विफ्ट 3.0 और स्विफ्ट 4.1

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.black : UIColor.white
    }
}

हाँ। यह ऐसा करने का अच्छा तरीका है। क्योंकि आप कई समान बटन को परिभाषित कर सकते हैं।
पॉल ब्रूज़ेन्स्की

3
बस एक नौसिखिया सवाल, आप उस बटन विधि को कहाँ उप-वर्ग करेंगे? यदि मेरे पास एक दृश्य नियंत्रक में एक बटन है जिसका नाम कनवर्ज़न व्यू कंट्रोलर है, तो हाइलाइट या टैप किए जाने पर मैं बैकग्राउंड कलर को बदलने के लिए बटन को कैसे सेटअप करूंगा? क्या मैं COnversionViewController में सेटिहाइडलाइट को उपवर्गित करूंगा?
बीनो १११६

तो इस जवाब के साथ एक समस्या है जो मुझे मिली। यदि आप चाहते हैं कि जब आपButton का चयन करें तो वही रंग उपलब्ध हो, तो setHighlighted को setSelected के बाद कहा जाता है और इस प्रकार आपके पास कोई भी चयनित स्टाइल ओवरराइड हो जाएगा। समाधान ऊपर बेहतर हो सकता है अगर आप के रूप में अच्छी बटन का चयन करना चाहते हैं
HaloZero

3
@YakivKovalskiy यह मानते हुए कि आप एक उप-वर्ग का उपयोग कर रहे हैं, आप दो UIColor गुण जोड़ सकते हैं जैसे normalBackground और highlightedBackground, उसके बाद self.backgroundColor = normalBackground या highlightedBackground असाइन करें। उपयोग की आसानी के लिए एक init विधि जोड़ना न भूलें जैसे initWithBackground: highlightedBackground:
SK।

2
अच्छा समाधान, सिर्फ एक सुझाव:backgroundColor = isHighlighted ? .lightGray : .white
Fantini

298

यकीन नहीं है कि अगर आप इस तरह का हल निकालते हैं, तो आप अपने सामान्य विकास परिदृश्य के साथ फिट बैठते हैं या नहीं, लेकिन पहली बात यह है कि मैं टचडाउन इवेंट में बटन का बैकग्राउंड कलर बदलना चाहूंगा।

विकल्प 1:

आपको कैप्चर करने के लिए दो इवेंट्स की आवश्यकता होगी, जब यूजर बटन दबाएगा तो UIControlEventTouchDown होगा। UIControlEventTouchUpInside और UIControlEventTouchUpOutside तब होगा जब वे बटन को सामान्य स्थिति में वापस करने के लिए जारी करेंगे

UIButton *myButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setFrame:CGRectMake(10.0f, 10.0f, 100.0f, 20.f)];
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitle:@"click me:" forState:UIControlStateNormal];
[myButton setTitle:@"changed" forState:UIControlStateHighlighted];
[myButton addTarget:self action:@selector(buttonHighlight:) forControlEvents:UIControlEventTouchDown];
[myButton addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside];

विकल्प 2:

आप चाहते हैं कि हाइलाइट रंग से बनाई गई एक छवि लौटें। यह एक श्रेणी भी हो सकती है।

+ (UIImage *)imageWithColor:(UIColor *)color {
   CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
   UIGraphicsBeginImageContext(rect.size);
   CGContextRef context = UIGraphicsGetCurrentContext();

   CGContextSetFillColorWithColor(context, [color CGColor]);
   CGContextFillRect(context, rect);

   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

और फिर बटन की हाइलाइट की गई स्थिति को बदलें:

[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];

3
UIControlEventTouchUpOutside और UIControlEventTouchCancel को बटन पर जोड़ें: घटना सूची और यह हमेशा काम करेगा।
एवेंज बोडुनोव

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

थॉमस द्वारा उत्तर बेहतर है और यही मैं भी उपयोग करता हूं
वैन डू ट्रान

26
यदि आप उपयोग कर रहे हैं layer.cornerRadiusऔर विकल्प # 2 के साथ जा रहे हैं , तो आपको clipsToBoundsछवि के कोनों को गोल करने के लिए सही सेट करना सुनिश्चित करना होगा ।
आकाश

3
किसी के द्वारा बंद हो जाता है और स्विफ्ट में एक जवाब की जरूरत है: stackoverflow.com/questions/26600980/...
winterized

94

highlightedगणना की गई संपत्ति के रूप में ओवरराइड करने की कोई आवश्यकता नहीं है । आप पृष्ठभूमि रंग परिवर्तन को ट्रिगर करने के लिए संपत्ति पर्यवेक्षक का उपयोग कर सकते हैं:

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

स्विफ्ट 4

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white
    }
}

1
मैंने कभी इस तरह की कार्यक्षमता का उपयोग नहीं किया है। क्या आप बता सकते हैं कि यह कहाँ जाता है? यह आईबीएशन बटनप्रेस फ़ंक्शन में है या व्यूडलड में?
डेव जी

क्या होगा अगर मेरे पास विभिन्न रंगों के साथ कई यूआईब्यूटन्स हैं?
स्लावचो

6
@ Gave, आप File>New>File>Cocoa Touch Classइसे क्लिक करके और सेट करके UIButton का एक नया उपवर्ग बनाएँ subclass of UIButton। फ़ाइल को पूर्व नाम दें CustomButton, जो फ़ाइल नाम और वर्ग नाम दोनों बन जाएगा। इस फ़ाइल के अंदर, override var highlightedऊपर दिखाया गया कोड डालें । अंतिम चरण, इस सबक्लास का उपयोग करने के लिए इंटरफ़ेस बिल्डर पर UIButton सेट करें, CustomButtonजहां वह "कस्टम क्लास" कहता है और ड्रॉपडाउन बॉक्स है। यह ग्रे अक्षरों में "यूब्यूटॉन" कहेगा। ड्रॉपडाउन सूची में कस्टमबटन को दिखाना चाहिए। इसे चुनें, और बटन अब उप-वर्गित हो गया है।
जेम्स टॉमी

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

तो यह काम करने के लिए आपको isHighlighted = falseशुरुआत में कहीं न कहीं स्पष्ट रूप से कॉल करने की आवश्यकता है (उदाहरण के लिए inititialization)।
दिमित्री

49

स्विफ्ट में एक आसान जेनेरिक एक्सटेंशन:

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color), forState: state)
    }
}

स्विफ्ट 3.0

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage? {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context?.setFillColor(color.cgColor)
        context?.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color: color), for: state)
    }
}

45

स्विफ्ट में आप सेट-हाईलाइट विधि को ओवरराइड करने के बजाय हाइलाइट की गई (या चयनित) संपत्ति के एक्सेसर को ओवरराइड कर सकते हैं

override var highlighted: Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                backgroundColor = UIColor.blackColor()
            }
            else {
                backgroundColor = UIColor.whiteColor()
            }
            super.highlighted = newValue
        }
    }

यह पूरी तरह से काम करता है, लेकिन मैं उलझन में हूं कि आप यह कैसे पता लगा पाए? प्रलेखन या UIButton.h में पैरामीटर नहीं हैं जहां तक ​​मैं बता सकता हूं।
शिमिज़ु

1
यह स्विफ्ट सिंटैक्स है जो उद्देश्य सी में ओवरलाइटिंग के व्यवहार का अनुकरण करता है। यहाँ पर कम्प्यूटेड प्रॉपर्टीज के डॉक्यूमेंटेशन देखें। डेवलपर
जेक हॉल

11
स्विफ्ट में आप डिडसेट
डैम

1
मैंने संपत्ति पर्यवेक्षक के साथ उदाहरण जोड़ा है: stackoverflow.com/a/29186375/195173
एचवीज माजालिक्स

मुझे लगता है कि @shimizu क्या पूछ रहा था कि आपको कैसे पता highlightedथा कि UIButton पर एक संपत्ति थी। इसका उत्तर यह है कि यह UIControl पर एक संपत्ति है जो UIButton को विरासत में मिली है।
एडम जॉन्स

25

ओवरराइड हाइलाइट किए गए चर। जोड़ना @IBInspectableआपको स्टोरीबोर्ड में हाइलाइट किए गए बैकग्राउंड को संपादित करता है, जो निफ्टी भी है।

class BackgroundHighlightedButton: UIButton {
    @IBInspectable var highlightedBackgroundColor :UIColor?
    @IBInspectable var nonHighlightedBackgroundColor :UIColor?
    override var highlighted :Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                self.backgroundColor = highlightedBackgroundColor
            }
            else {
                self.backgroundColor = nonHighlightedBackgroundColor
            }
            super.highlighted = newValue
        }
    }
}

20

अधिक कॉम्पैक्ट समाधान ( @ aleksejs-mjaliks उत्तर पर आधारित ):

स्विफ्ट 3/4 + :

override var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? .lightGray : .white
    }
}

स्विफ्ट 2:

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

यदि आप ओवरराइड नहीं करना चाहते हैं, तो यह @ तैमूर-बर्निकोविच के उत्तर ( स्विफ्ट 4.2 :) का अपडेटेड संस्करण है :

extension UIButton {
  func setBackgroundColor(_ color: UIColor, forState controlState: UIControl.State) {
    let colorImage = UIGraphicsImageRenderer(size: CGSize(width: 1, height: 1)).image { _ in
      color.setFill()
      UIBezierPath(rect: CGRect(x: 0, y: 0, width: 1, height: 1)).fill()
    }
    setBackgroundImage(colorImage, for: controlState)
  }
}

@FedericoZanetello यह आपके ऐप के सभी बटनों में अलग है, जो मेरी राय में एक अच्छा समाधान नहीं है। बीमार तैमूर के जवाब के साथ।
उस्मा बिन अटिक

13

स्विफ्ट 3+ सिंटैक्स के साथ UIButton एक्सटेंशन :

extension UIButton {
    func setBackgroundColor(color: UIColor, forState: UIControlState) {
        UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
        UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
        UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        let colorImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.setBackgroundImage(colorImage, for: forState)
    }}

इसका उपयोग करें जैसे:

YourButton.setBackgroundColor(color: UIColor.white, forState: .highlighted)

मूल उत्तर: https://stackoverflow.com/a/30604658/3659227


10

यहां स्विफ्ट में एक दृष्टिकोण है, एक IBInspectable को जोड़ने के लिए एक UIButton एक्सटेंशन का उपयोग करके, जिसे हाइलाइट किए गए BackgroundColor कहा जाता है। उपवर्ग के समान, उपवर्ग की आवश्यकता के बिना।

private var HighlightedBackgroundColorKey = 0
private var NormalBackgroundColorKey = 0

extension UIButton {

    @IBInspectable var highlightedBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &HighlightedBackgroundColorKey) as? UIColor
        }

        set(newValue) {
            objc_setAssociatedObject(self,
                &HighlightedBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    private var normalBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &NormalBackgroundColorKey) as? UIColor
        }

        set(newValue) {
            objc_setAssociatedObject(self,
                &NormalBackgroundColorKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    override public var backgroundColor: UIColor? {
        didSet {
            if !highlighted {
                normalBackgroundColor = backgroundColor
            }
        }
    }

    override public var highlighted: Bool {
        didSet {
            if let highlightedBackgroundColor = self.highlightedBackgroundColor {
                if highlighted {
                    backgroundColor = highlightedBackgroundColor
                } else {
                    backgroundColor = normalBackgroundColor
                }
            }
        }
    }
}

आशा है कि ये आपकी मदद करेगा।


1
तेजी से 2.0 के लिए, आपको एक एनम का उपयोग करने के लिए objc_setAssociatedObject पर कॉल अपडेट करना होगा: objc_setAssociatedObject (self, & NormalBackgroundColorKey, newbalue, .OBJC_ASSOCIATION_RETAIN)
एली बुर्के

स्विफ्ट में निश्चित रूप से सबसे अच्छा तरीका है अगर आप इसे स्टोरीबोर्ड में रखना चाहते हैं।
davidethell

1
मैं उपवर्ग का उपयोग नहीं करना पसंद करता हूं क्योंकि यह पूरे ऐप को प्रभावित करेगा
होसाम घ्रीब


9

सबक्लासिंग के बिना स्विफ्ट 3+ के लिए मेरा सबसे अच्छा समाधान ।

extension UIButton {
  func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
    let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
    UIGraphicsBeginImageContext(rect.size)
    color.setFill()
    UIRectFill(rect)
    let colorImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    setBackgroundImage(colorImage, for: state)
  }
}

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

button.setBackgroundColor(.red, for: .normal)

4

अपडेट करें:

UIButtonBackgroundColor स्विफ्ट लाइब्रेरी का उपयोग करें ।

पुराना:

ग्रेस्केल फिल रंग के साथ 1 px x 1 px छवि बनाने के लिए नीचे दिए गए सहायकों का उपयोग करें:

UIImage *image = ACUTilingImageGray(248/255.0, 1);

या RGB भरण रंग:

UIImage *image = ACUTilingImageRGB(253/255.0, 123/255.0, 43/255.0, 1);

फिर, imageबटन की पृष्ठभूमि छवि सेट करने के लिए इसका उपयोग करें:

[button setBackgroundImage:image forState:UIControlStateNormal];

सहायकों

#pragma mark - Helpers

UIImage *ACUTilingImageGray(CGFloat gray, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetGrayFillColor(context, gray, alpha);
    });
}

UIImage *ACUTilingImageRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetRGBFillColor(context, red, green, blue, alpha);
    });
}

UIImage *ACUTilingImage(CGFloat alpha, void (^setFillColor)(CGContextRef context))
{
    CGRect rect = CGRectMake(0, 0, 0.5, 0.5);
    UIGraphicsBeginImageContextWithOptions(rect.size, alpha == 1, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    setFillColor(context);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

नोट: ACUमेरी कोको टच स्टेटिक लाइब्रेरी का वर्ग उपसर्ग है जिसे अकानी यूटिलिटीज कहा जाता है, जहां एसी एसीनी के लिए है, और यू यूटिलिटीज के लिए है।


4

इसे इस्तेमाल करे !!!!

TouchedDown इवेंट सेट के लिए एक रंग और TouchUpInside अन्य सेट के लिए।

- (IBAction)touchedDown:(id)sender {
    NSLog(@"Touched Down");
    btn1.backgroundColor=[UIColor redColor];
}

- (IBAction)touchUpInside:(id)sender {
    NSLog(@"TouchUpInside");
    btn1.backgroundColor=[UIColor whiteColor];    
}

2
मेरे लिए काम किया। मुझे सिर्फ - (IBAction)onButtonTouchDragOutside:(UIButton *)sender {यह सुनिश्चित करने के लिए जोड़ना था कि जब उपयोगकर्ता गलती से बटन से अपनी उंगली को हटा देता है तो रंग नहीं रहता है।
सुदोप्लज़

4

UIButton को उपवर्ग करें और सुविधाजनक उपयोग के लिए निरीक्षण योग्य गुण जोड़ें (स्विफ्ट 3.0 में लिखा गया है):

final class SelectableBackgroundButton: UIButton {

    private struct Constants {
        static let animationDuration: NSTimeInterval = 0.1
    }

    @IBInspectable
    var animatedColorChange: Bool = true

    @IBInspectable
    var selectedBgColor: UIColor = UIColor.blackColor().colorWithAlphaComponent(0.2)

    @IBInspectable
    var normalBgColor: UIColor = UIColor.clearColor()

    override var selected: Bool {
        didSet {
            if animatedColorChange {
                UIView.animateWithDuration(Constants.animationDuration) {
                    self.backgroundColor = self.selected ? self.selectedBgColor : self.normalBgColor
                }
            } else {
                self.backgroundColor = selected ? selectedBgColor : normalBgColor
            }
        }
    }

    override var highlighted: Bool {
        didSet {
            if animatedColorChange {
                UIView.animateWithDuration(Constants.animationDuration) {
                    self.backgroundColor = self.highlighted ? self.selectedBgColor : self.normalBgColor
                }
            } else {
                self.backgroundColor = highlighted ? selectedBgColor : normalBgColor
            }
        }
    }
}

3

आप UIButton को उपवर्ग कर सकते हैं और एक अच्छा फोरस्टेट बना सकते हैं।

colourButton.h

#import <UIKit/UIKit.h>

@interface colourButton : UIButton

-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;

@end

colourButton.m

#import "colourButton.h"

@implementation colourButton
{
    NSMutableDictionary *colours;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    // If colours does not exist
    if(!colours)
    {
        colours = [NSMutableDictionary new];  // The dictionary is used to store the colour, the key is a text version of the ENUM
        colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]] = (UIColor*)self.backgroundColor;  // Store the original background colour
    }

    return self;
}

-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state
{
    // If it is normal then set the standard background here
    if(state & UIControlStateNormal)
    {
        [super setBackgroundColor:backgroundColor];
    }

    // Store the background colour for that state
    colours[[NSString stringWithFormat:@"%lu", state]]= backgroundColor;
}

-(void)setHighlighted:(BOOL)highlighted
{
    // Do original Highlight
    [super setHighlighted:highlighted];

    // Highlight with new colour OR replace with orignial
    if (highlighted && colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]])
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]];
    }
    else
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
    }
}

-(void)setSelected:(BOOL)selected
{
    // Do original Selected
    [super setSelected:selected];

    // Select with new colour OR replace with orignial
    if (selected && colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]])
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]];
    }
    else
    {
        self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
    }
}

@end

टिप्पणियाँ (यह एक उदाहरण है, मुझे पता है कि समस्याएं हैं और यहां कुछ हैं)

मैंने प्रत्येक राज्य के लिए UIColor स्टोर करने के लिए एक NSMutableDictionay का उपयोग किया है, मुझे कुंजी के लिए एक गंदा टेक्स्ट रूपांतरण करना है क्योंकि UIControlState एक अच्छा सीधा Int नहीं है। यदि यह वह जगह है जहाँ आप उस कई वस्तुओं के साथ एक ऐरे में प्रवेश कर सकते हैं और एक सूचकांक के रूप में राज्य का उपयोग कर सकते हैं।

इस वजह से आपको कई चयनित और अक्षम बटन के साथ कठिनाइयाँ होती हैं, कुछ और तर्क की आवश्यकता होती है।

एक और समस्या यह है कि यदि आप एक ही समय में कई रंगों की कोशिश करते हैं और सेट करते हैं, तो मैंने एक बटन के साथ कोशिश नहीं की है, लेकिन यदि आप ऐसा कर सकते हैं तो यह काम नहीं कर सकता है

 [btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];

मैंने मान लिया है कि यह StoryBoard है, कोई init नहीं है, initWithFrame है, इसलिए यदि आवश्यक हो तो उन्हें जोड़ें।


3
extension UIButton {
    func setBackgroundColor(color: UIColor, forState: UIControl.State) {
        let size = CGSize(width: 1, height: 1)
        UIGraphicsBeginImageContext(size)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(color.cgColor)
        context?.fill(CGRect(origin: CGPoint.zero, size: size))
        let colorImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        setBackgroundImage(colorImage, for: forState)
    }

}

स्विफ्ट 5 , धन्यवाद @Maverick


3

विवरण

  • Xcode 11.1 (11A1027), स्विफ्ट 5

उपाय

import UIKit

extension UIColor {
    func createOnePixelImage() -> UIImage? {
        let size = CGSize(width: 1, height: 1)
        UIGraphicsBeginImageContext(size)
        defer { UIGraphicsEndImageContext() }
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        context.setFillColor(cgColor)
        context.fill(CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

extension UIButton {
    func setBackground(_ color: UIColor, for state: UIControl.State) {
        setBackgroundImage(color.createOnePixelImage(), for: state)
    }
}

प्रयोग

button.setBackground(.green, for: .normal)

2

यदि आपके पास एक छवि है तो इसे आज़माएँ:

-(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;

या देखें कि showsTouchWhenHighlightedक्या आपके लिए पर्याप्त है।


मैंने शोटेक के साथ खेलने की कोशिश की है। जब घेर लिया गया, लेकिन इससे कोई फायदा नहीं हुआ। मैं setBackgroundImage का उपयोग नहीं करना चाहता: forState:। मैं वास्तव में किसी भी छवि का उपयोग नहीं करने के लिए पृष्ठभूमि का उपयोग करने की कोशिश कर रहा था।
मार्टिनमोइर

2

इस गैपिंग फंक्शनल होल को भरने के लिए मैंने एक यूआईब्यूटन सबक्लास , एसटैबटन को ओपन-सोर्स किया है । एमआईटी लाइसेंस के तहत उपलब्ध है। IOS 7+ के लिए काम करता है (मैंने पुराने iOS संस्करणों के साथ परीक्षण नहीं किया है)।


2

इस समस्या को हल करने के लिए मैंने backgroundColorराज्यों को संभालने के लिए एक श्रेणी बनाई UIButtons:
ButtonBackgroundColor-iOS

आप श्रेणी को फली के रूप में स्थापित कर सकते हैं ।

उद्देश्य-सी के साथ उपयोग करना आसान है

@property (nonatomic, strong) UIButton *myButton;

...

[self.myButton bbc_backgroundColorNormal:[UIColor redColor]
                 backgroundColorSelected:[UIColor blueColor]];

स्विफ्ट के साथ उपयोग करने के लिए और भी आसान :

import ButtonBackgroundColor

...

let myButton:UIButton = UIButton(type:.Custom)

myButton.bbc_backgroundColorNormal(UIColor.redColor(), backgroundColorSelected: UIColor.blueColor())

मैं आपको फली को आयात करने की सलाह देता हूं:

platform :ios, '8.0'
use_frameworks!

pod 'ButtonBackgroundColor', '~> 1.0'

Use_frameworks का उपयोग करना! अपने पॉडफाइल में स्विफ्ट और उद्देश्य-सी के साथ अपने पॉड्स का उपयोग करना आसान बनाता है।

जरूरी

मैंने अधिक जानकारी के साथ एक ब्लॉग पोस्ट भी लिखा।


2
class CustomButton: UIButton {

    override var isHighlighted: Bool {
        didSet {
            if (isHighlighted) {
                alpha = 0.5
            }
            else {
                alpha = 1
            }            
        }
    }

}


1

कोशिश करें tintColor:

_button.tintColor = [UIColor redColor];

क्या आप सुनिश्चित हैं कि यह IB में लिंक है? यदि आप करते हैं तो आपको क्या मिलेगा NSLog(@"%@", _button);?
jjv360

1
यदि आप उपयोग कर रहे हैं तो यह काम नहीं करेगा UIButtonTypeCustom
जेरेडह

1

यहां बटन स्थिति का चयन करने के लिए स्विफ्ट में कोड है:

func imageWithColor(color:UIColor) -> UIImage {
    let rect:CGRect = CGRectMake(0.0, 0.0, 1.0, 1.0)
     UIGraphicsBeginImageContext(rect.size)
    let context:CGContextRef = UIGraphicsGetCurrentContext()!
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextFillRect(context, rect)
    let image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
    return image;
}

उदाहरण:

    self.button.setImage(self.imageWithColor(UIColor.blackColor()), forState: .Highlighted)

1

इसे ड्रॉप करें और आप जाने के लिए अच्छा हैं:
* प्रोबेटरी को आईबी में सेट किया जा सकता है, और यदि कोई हाइलाइटेड बैकग्राउंड सेट नहीं है, तो प्रेस करने पर बैकग्राउंड नहीं बदलेगा

private var highlightedBackgroundColors = [UIButton:UIColor]()
private var unhighlightedBackgroundColors = [UIButton:UIColor]()
extension UIButton {

    @IBInspectable var highlightedBackgroundColor: UIColor? {
        get {
            return highlightedBackgroundColors[self]
        }

        set {
            highlightedBackgroundColors[self] = newValue
        }
    }

    override open var backgroundColor: UIColor? {
        get {
            return super.backgroundColor
        }

        set {
            unhighlightedBackgroundColors[self] = newValue
            super.backgroundColor = newValue
        }
    }

    override open var isHighlighted: Bool {
        get {
            return super.isHighlighted
        }

        set {
            if highlightedBackgroundColor != nil {
                super.backgroundColor = newValue ? highlightedBackgroundColor : unhighlightedBackgroundColors[self]
            }
            super.isHighlighted = newValue
        }
    }
}

1

नीचे UIIImageविस्तार निर्दिष्ट रंग पैरामीटर के साथ छवि ऑब्जेक्ट उत्पन्न करेगा।

extension UIImage {
    static func imageWithColor(tintColor: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        tintColor.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
       }
    }

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

setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 232/255, green: 130/255, blue: 121/255, alpha: 1.0)), for: UIControlState.highlighted)

setupButton.setBackgroundImage(UIImage.imageWithColor(tintColor: UIColor(displayP3Red: 255/255, green: 194/255, blue: 190/255, alpha: 1.0)), for: UIControlState.normal)

1

सरल है कि केवल UIButton एक्सटेंशन का उपयोग करें

extension UIButton {

    func setBackgroundColor(color: UIColor, forState: UIControl.State) {
        self.clipsToBounds = true  // add this to maintain corner radius
        UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
        if let context = UIGraphicsGetCurrentContext() {
            context.setFillColor(color.cgColor)
            context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
            let colorImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            self.setBackgroundImage(colorImage, for: forState)
        }
    }

}

और इस का उपयोग करें

 optionButton.setBackgroundColor(color: UIColor(red:0.09, green:0.42, blue:0.82, alpha:1.0), forState: .selected)

 optionButton.setBackgroundColor(color: UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0), forState: .highlighted)

 optionButton.setBackgroundColor(color: UIColor(red:0.96, green:0.96, blue:0.96, alpha:1.0), forState: .normal)


0

स्विफ्ट 3:

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRect(x:0.0,y:0.0,width: 1.0,height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context!.setFillColor(color.cgColor)
        context!.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }

    func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color: color), for: state)
    }
}

0

स्विफ्ट 5 में

उन लोगों के लिए जो चयनित राज्य को हरा करने के लिए रंगीन पृष्ठभूमि का उपयोग नहीं करना चाहते हैं

बस आप #Selector का उपयोग करके समस्या को हरा सकते हैं और यदि स्टेटमेंट को प्रत्येक राज्य के लिए UIButton रंगों को व्यक्तिगत रूप से आसानी से बदलने के लिए

उदाहरण के लिए:

    override func viewDidLoad() {
    super.viewDidLoad()
    self.myButtonOutlet.backgroundColor = UIColor.white  //to reset the button color to its original color ( optionally )
}

@IBOutlet weak var myButtonOutlet: UIButton!{
    didSet{  // Button selector and image here
        self.myButtonOutlet.setImage(UIImage(systemName: ""), for: UIControl.State.normal)

        self.myButtonOutlet.setImage(UIImage(systemName: "checkmark"), for: UIControl.State.selected)



        self.myButtonOutlet.addTarget(self, action: #selector(tappedButton), for: UIControl.Event.touchUpInside)
    }
}

@objc func tappedButton() {  // Colors selection is here
    if self.myButtonOutlet.isSelected == true {

        self.myButtonOutlet.isSelected = false
        self.myButtonOutlet.backgroundColor = UIColor.white         
    } else {
        self.myButtonOutlet.isSelected = true

        self.myButtonOutlet.backgroundColor = UIColor.black
        self.myButtonOutlet.tintColor00 = UIColor.white

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