ios - হাইলাইট করা অবস্থায় UI UI এর পটভূমি রঙটি কিভাবে পরিবর্তন করবেন?




objective-c xcode (18)

Swift একটি সহজ জেনেরিক এক্সটেনশান:

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

আমার অ্যাপের কোনও সময়ে আমার একটি UIButton (উদাহরণস্বরূপ, যখন কোন ব্যবহারকারীর বোতামে তার আঙ্গুল থাকে) এবং আমাকে বোতামটি হাইলাইট করার সময় ব্যাকগ্রাউন্ডের রঙ পরিবর্তন করতে হবে (তাই ব্যবহারকারীর আঙ্গুলটি এখনও বাটনটিতে রয়েছে )।

আমি নিম্নলিখিত চেষ্টা:

_button.backgroundColor = [UIColor redColor];

কিন্তু এটা কাজ করছে না। রঙ একই রয়ে যায়। আমি বোতামটি হাইলাইট না করা এবং এটি সূক্ষ্ম কাজ করার সময় কোডের একই অংশটি চেষ্টা করেছিলাম। আমি রঙ পরিবর্তন করার পরে সেট- -setNeedsDisplay করার চেষ্টা করেছি, এটির কোনো প্রভাব নেই।

কিভাবে পটভূমির রং পরিবর্তন বাটন জোর?


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

আপনি UIButton সাবclass এবং স্ট্যাটাস জন্য একটি সুন্দর করতে পারেন।

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];

আমি এই স্টোরিবোর্ডটি অনুমান করেছি, সেখানে কোন ইনিট নেই, initWithFrame তাই আপনাকে তাদের প্রয়োজন হলে তাদের যুক্ত করুন।



আমি এই STAButton কার্যকারিতা গর্ত পূরণ করতে একটি UIButton উপশ্রেণী, STAButton , খোলা-sourced আছে। এমআইটি লাইসেন্সের অধীনে উপলব্ধ। আইওএস 7+ এর জন্য কাজ করে (আমি পুরোনো iOS সংস্করণগুলির সাথে পরীক্ষা করে দেখিনি)।


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

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

উদ্দেশ্য-সি সঙ্গে ব্যবহার করা সহজ

@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 ব্যবহার করে! আপনার পডফিল এ সুইফ্ট এবং উদ্দেশ্য-সি দিয়ে আপনার পডগুলি ব্যবহার করা সহজ করে তোলে।

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

somethingaboutios.wordpress.com/2016/02/09/…


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

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

আশা করি এটা কাজে লাগবে.


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

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

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

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

গণিত সম্পত্তি হিসাবে highlighted override কোন প্রয়োজন নেই। আপনি ব্যাকগ্রাউন্ড রঙ পরিবর্তন ট্রিগার সম্পত্তি পর্যবেক্ষক ব্যবহার করতে পারেন:

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

সুইফ্ট 4

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

বোতামের জন্য নির্বাচন করার জন্য এখানে সুইফ্ট কোডটি রয়েছে:

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)

যদি আপনি ঠিক দুটি পদক্ষেপ স্পর্শডাউন touchUpInside সেট override না


সাব classing ছাড়া 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)

সুইফ্টে আপনি setHighlighted পদ্ধতিটি ওভাররাইড করার পরিবর্তে হাইলাইট করা (বা নির্বাচিত) সম্পত্তির অ্যাক্সেসরকে ওভাররাইড করতে পারেন

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

হাইলাইট পরিবর্তনশীল override। @IBInspectable যোগ করা আপনাকে স্টোরিবোর্ডে হাইলাইট করা ব্যাকগ্রাউন্ড @IBInspectable সম্পাদনা করে, যা @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
        }
    }
}

https://github.com/swordray/UIButtonSetBackgroundColorForState ব্যবহার করুন

CocoaPods ব্যবহার করে Podfile যোগ করুন

pod "UIButtonSetBackgroundColorForState"

দ্রুতগতি

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

উদ্দেশ্য গ

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

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)

সুইফ্ট 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://.com/a/30604658/3659227


class CustomButton: UIButton {

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

}




uibutton