কোনও 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
কেবল একটি নবাগত প্রশ্ন, আপনি কোথায় বাটন পদ্ধতিটি সাবক্লাস করবেন? কনভার্সনভিউ কনট্রোলার নামের একটি ভিউ কন্ট্রোলারে আমার যদি একটি বোতাম থাকে, তবে আমি হাইলাইট বা ট্যাপ করা অবস্থায় পটভূমির রঙ পরিবর্তন করার জন্য কীভাবে বোতামটি সেটআপ করব? আমি কি কাভার্সভিউকন্ট্রোলারটিতে সেটচিহলাইটটি সাবক্লাস করব?
Beanno1116

সুতরাং এই উত্তরটির সাথে একটি সমস্যা আছে যা আমি পেয়েছি। আপনি বাটনটি সিলেক্ট করার সময় যদি একই রঙটি পেতে চান তবে সেট হাইলাইটলাইট সেট-সিলেক্টডের পরে ডাকা হবে এবং এভাবে আপনার নির্বাচিত স্টাইলিংকে ওভাররাইড করবে। উপরের সমাধানটি আরও ভাল হতে পারে যদি আপনি
বাটনটিও

3
@ ইয়াকীবকভালস্কি ধরে নিচ্ছেন আপনি একটি উপ-শ্রেণীর ব্যবহার করছেন, আপনি দুটি ইউআইসিওলর বৈশিষ্ট্য যুক্ত করতে পারেন যেমন নরমালব্যাকগ্রাউন্ড এবং হাইলাইটডব্যাকগ্রাউন্ড, তারপরে স্বতঃব্যাকগ্রাউন্ড কালার = নরমালব্যাকগ্রাউন্ড বা হাইলাইটডব্যাকগ্রাউন্ড নির্ধারণ করুন। ব্যবহারের সুবিধার্থে একটি init পদ্ধতি যুক্ত করতে ভুলবেন না যেমন উদ্বোধনী ব্যাকগ্রাউন্ড: হাইলাইটডব্যাকগ্রাউন্ড:
এসকে।

2
দুর্দান্ত সমাধান, কেবল একটি পরামর্শ:backgroundColor = isHighlighted ? .lightGray : .white
ফ্যান্টিনি

298

নিশ্চিত না যে এই ধরণের মাধ্যমে আপনি যা করছেন তা সমাধান হয় বা আপনার সাধারণ বিকাশের ল্যান্ডস্কেপগুলির সাথে ফিট করে তবে আমি প্রথমে যা চেষ্টা করব তা হ'ল টাচডাউন ইভেন্টের বোতামটির ব্যাকগ্রাউন্ডের রঙ পরিবর্তন করা।

বিকল্প 1:

ক্যাপচার করার জন্য আপনার দুটি ইভেন্টের প্রয়োজন হবে, ইউআইসিএন্ট্রোলটেন্ট টুচডাউন ব্যবহারকারী যখন বোতাম টিপবে তখন তা হবে। 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
কেউ যদি থামেন এবং সুইফটে
শীতকালীন

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
আমি কখনও এর মতো কার্যকারিতা ব্যবহার করি নি। আপনি কোথায় বলতে পারেন? এটি আইবিএশন বাটনপ্রেস ফাংশনে বা ভিডডিডলয়েডে রয়েছে?
ডেভ জি

আমার যদি বিভিন্ন রঙের একাধিক UIButtons থাকে?
স্লাভচো

6
@ ডেভ জি, আপনি ক্লিক File>New>File>Cocoa Touch Classকরে এটি সেট করে ইউআইবাটন একটি নতুন সাবক্লাস তৈরি করেছেন subclass of UIButton। প্রাক্তনের জন্য ফাইলটির নাম দিন CustomButton, যা ফাইলের নাম এবং শ্রেণীর নাম উভয় হয়ে উঠবে। এই ফাইলের ভিতরে, override var highlightedউপরে প্রদর্শিত কোডটি রাখুন। শেষ পদক্ষেপটি, CustomButtonসম্পত্তি পৃষ্ঠাতে যেখানে এটি "কাস্টম ক্লাস" বলে এবং সেখানে একটি ড্রপডাউন বাক্সে গিয়ে এই সাবক্লাসটি ব্যবহার করতে ইন্টারফেস বিল্ডারে ইউআইবাটন সেট করুন set এটি ধূসর বর্ণগুলিতে "ইউআইবাটন" বলবে। ড্রপডাউন তালিকার কাস্টমবটনটি দেখা উচিত। এটি নির্বাচন করুন এবং বোতামটি এখন সাবক্লাস করা হয়েছে।
জেমস টমি

কেন কেউ উল্লেখ করেন নি যে সেটারটি কেবল তখনই কল করা হবে যখন আপনি বোতামটি ট্যাপ করবেন, তবে প্রাথমিক বিন্যাসের সময় নয়! সুতরাং ডিফল্টরূপে বোতামটি স্পর্শ না করা পর্যন্ত কোনও রঙ নেই।
দিমিত্রি

সুতরাং এটি কার্যকর করার জন্য আপনাকে isHighlighted = falseপ্রারম্ভিকভাবে কোথাও কল করতে হবে (উদাহরণস্বরূপ দীক্ষায়) on
দিমিত্রি

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
আলেকসেজেস মজালিক্স

আমি মনে করি @ শিমিজু যা জিজ্ঞাসা করছিল তা হ'ল আপনি কীভাবে জানেন যে ইউআইবাটনের highlightedএকটি সম্পত্তি। উত্তরটি হ'ল এটি ইউআইসিএনট্রোলের একটি সম্পত্তি যা ইউআইবাটন উত্তরাধিকার সূত্রে প্রাপ্ত।
অ্যাডাম জনস

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

একটি আরও কমপ্যাক্ট সমাধান ( @ অ্যালেক্সেস-এমজালিক্সের উপর ভিত্তি করে) উত্তরের ):

সুইফ্ট 3/4 + :

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

সুইফট 2:

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

আপনি যদি ওভাররাইড করতে না চান, এটি @ টিমুর-বার্নিকোইচের উত্তর ( সুইফট ৪.২ ) এর একটি আপডেট সংস্করণ :

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)
  }
}

@ ফেডেরিকো জানেটেলো এটি আপনার অ্যাপের সমস্ত বোতামে হাইটলাইটকে ওভাররাইড করবে, যা আমার মতে ভাল সমাধান নয়। অসুস্থ তাইমুর এর উত্তর সঙ্গে।
উসামা বিন আতিক

13

সুইফট 3+ সিনট্যাক্স সহ ইউআইবাটন এক্সটেনশন :

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

হাইডলাইটডব্যাকগ্রাউন্ড কালার নামে পরিচিত একটি আইবিআইস্পেসটেবল যুক্ত করতে একটি ইউআইবাটন এক্সটেনশন ব্যবহার করে সুইফটে এখানে একটি পদ্ধতির কথা বলা হয়েছে। সাবক্লাসিংয়ের অনুরূপ, সাবক্লাসের প্রয়োজন ছাড়াই।

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
সুইফট ২.০ এর জন্য, এনাম ব্যবহারের জন্য আপনাকে আপত্তি_সেটঅ্যাসোসিয়েটেডবজেক্টে কলটি আপডেট করতে হবে: اعتراض / সেটঅ্যাসোসিয়েটেডবজেক্ট (স্ব, এবং নরমালব্যাকগ্রাউন্ড কালারকি, নিউভ্যালু, .OBJC_ASSOCIATION_RETAIN)
এলি বার্ক

আপনি যদি সব কিছু স্টোরিবোর্ডে রাখতে চান তবে অবশ্যই সুইফটে সবচেয়ে ভাল উপায়।
ডেভিডথেল

1
আমি সাবক্লাস নয় এক্সটেনশন ব্যবহার পছন্দ করি কারণ এটি পুরো অ্যাপ্লিকেশনটিকে প্রভাবিত করবে
হোসাম গারিব

9

আপনি এই বিভাগটি ব্যবহার করতে পারেন যা পদ্ধতি সেটব্যাকগ্রাউন্ড কালার যুক্ত করে: ফর্ম স্টেট:

https://github.com/damienromito/UIButton-setBackgroundColor-forState-


1
বিশাল সুবিধা যে এর জন্য সাবক্লাসিংয়ের প্রয়োজন নেই।
gnasher729

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

হালনাগাদ:

ইউআইবাটনব্যাকগ্রাউন্ড কালার ব্যবহার করুন সুইফট লাইব্রেরি ।

পুরানো:

গ্রেস্কেল ভরাট রঙের সাথে একটি 1 পক্স x 1 পিক্স্স চিত্র তৈরি করতে নীচের সহায়কগুলি ব্যবহার করুন:

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

বা একটি আরজিবি ভরাট রঙ:

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

এটা চেষ্টা কর !!!!

টাচডাউন ইভেন্টের জন্য একটি রঙ সেট করুন এবং টাচআপআইনসাইডের জন্য অন্যটি সেট করুন।

- (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

আপনি ইউআইবাটন সাবক্লাস করতে পারেন এবং একটি দুর্দান্ত ফোর স্টেট তৈরি করতে পারেন।

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

মন্তব্য (এটি একটি উদাহরণ, আমি জানি সমস্যা আছে এবং এখানে কিছু রয়েছে)

আমি প্রতিটি রাজ্যের ইউআইসিআর সংরক্ষণ করার জন্য একটি এনএসমিটেবলডিকশন ব্যবহার করেছি, আমাকে কীটির জন্য একটি বাজে টেক্সট রূপান্তর করতে হবে কারণ ইউআইসিন্ট্রোলস্টেট কোনও ভাল সোজা ইন্ট নয়। এটি যদি আপনি সেই অনেকগুলি অবজেক্টের সাথে একটি অ্যারের সূচনা করতে পারেন এবং রাজ্যটিকে একটি সূচক হিসাবে ব্যবহার করতে পারেন।

এ কারণে আপনার অনেকের যেমন একটি নির্বাচিত এবং অক্ষম বোতামটি নিয়ে সমস্যা রয়েছে, আরও কিছু যুক্তি প্রয়োজন।

অন্য সমস্যাটি হ'ল যদি আপনি একই সাথে একাধিক রঙগুলি চেষ্টা করে দেখেন তবে আমি একটি বোতাম দিয়ে চেষ্টা করিনি তবে আপনি যদি এটি করতে পারেন তবে এটি কাজ নাও করতে পারে

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

আমি ধরে নিয়েছি এটি স্টোরিবোর্ড, কোনও দীক্ষা নেই, ইনফ্রেম নেই তাই আপনার যদি তাদের প্রয়োজন হয় তবে এগুলি যুক্ত করুন।


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 , ধন্যবাদ @ মাভারিক


3

বিস্তারিত

  • এক্সকোড 11.1 (11 এ 1027), সুইফট 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পক্ষে যথেষ্ট কিনা ।


আমি শো টাচওয়ানহাইলাইটলাইটের সাথে চারপাশে খেলার চেষ্টা করেছি তবে এটি কোনও লাভ হয়নি। আমি সেটব্যাকগ্রাউন্ড ইমেজ: ফরস্টেট: ব্যবহার করতে চাই না। আমি আসলে কোনও চিত্র ব্যবহার না করার জন্য ব্যাকগ্রাউন্ড কালার ব্যবহার করার চেষ্টা করছিলাম।
মার্টিনমাইজার্ড

2

এই ফাঁক কার্যকারিতা গর্তটি পূরণ করার জন্য আমি একটি ইউআইবাটন সাবক্লাস, স্ট্যাবটটনকে ওপেনস্রোস করেছি । এমআইটি লাইসেন্সের অধীনে উপলব্ধ। আইওএস 7+ এর জন্য কাজ করে (আমি পুরানো আইওএস সংস্করণ দিয়ে পরীক্ষা করিনি)।


2

এই সমস্যা সমাধানের জন্য আমি backgroundColorরাজ্যগুলি পরিচালনা করতে একটি বিভাগ তৈরি করেছি UIButtons:
বাটনব্যাকগ্রাউন্ড কালার-আইওএস

আপনি পোড হিসাবে বিভাগটি ইনস্টল করতে পারেন ।

উদ্দেশ্য-সি এর সাথে ব্যবহার করা সহজ to

@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'

ব্যবহার_ ফ্রেমওয়ার্ক ব্যবহার! আপনার পোডফাইলে আপনার পোডগুলিকে সুইফ্ট এবং অবজেক্টিভ-সি দিয়ে ব্যবহার করা আরও সহজ করে তোলে।

গুরুত্বপূর্ণ

আরও তথ্য সহ আমি একটি ব্লগ পোস্টও লিখেছি।


2
class CustomButton: UIButton {

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

}

2

Https://github.com/swordray/UIButtonSetBackgroundColorforState ব্যবহার করুন

কোকোপডস ব্যবহার করে পডফাইলে যুক্ত করুন

pod "UIButtonSetBackgroundColorForState"

দ্রুতগতি

button.setBackgroundColor(.red, forState: .highlighted)

উদ্দেশ্য গ

[button setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];

1

চেষ্টা করুন tintColor:

_button.tintColor = [UIColor redColor];

আপনি কি নিশ্চিত যে এটি আইবিতে যুক্ত হয়েছে? আপনি কি করলে কি পাবেন 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

সহজ যে কেবলমাত্র ইউআইবাটন এক্সটেনশনটি ব্যবহার করুন

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 এ

তাদের জন্য যারা নির্বাচিত রাজ্যটিকে পরাজিত করতে রঙিন পটভূমি ব্যবহার করতে চান না

সহজেই আপনি # নির্বাচক এবং প্রতিটি স্টেটের জন্য পৃথকভাবে সহজেই ইউআই বাটন রঙ পরিবর্তন করতে স্টেটমেন্ট ব্যবহার করে সমস্যাটি হারাতে পারেন easily

উদাহরণ স্বরূপ:

    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

    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.