Bagaimana cara mengubah warna latar belakang UIButton saat disorot?

236

Pada beberapa titik di aplikasi saya, saya memiliki yang disorot UIButton(misalnya ketika pengguna memiliki jari pada tombol) dan saya perlu mengubah warna latar belakang saat tombol disorot (jadi saat jari pengguna masih pada tombol) .

Saya mencoba yang berikut ini:

_button.backgroundColor = [UIColor redColor];

Tapi itu tidak berhasil. Warnanya tetap sama. Saya mencoba potongan kode yang sama ketika tombol tidak disorot dan berfungsi dengan baik. Saya juga mencoba menelepon -setNeedsDisplaysetelah mengubah warna, itu tidak berpengaruh.

Bagaimana cara memaksa tombol untuk mengubah warna latar belakang?

MartinMoizard
sumber

Jawaban:

411

Anda dapat mengganti UIButton's setHighlightedmetode.

Objektif-C

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

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

Swift 3.0 dan Swift 4.1

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.black : UIColor.white
    }
}
Thomas Decaux
sumber
Ya. Ini semacam cara yang baik untuk melakukan ini. Karena Anda dapat menentukan beberapa tombol serupa.
Paul Brewczynski
3
Hanya pertanyaan pemula, di mana Anda akan mensubclass metode tombol itu? Jika saya memiliki tombol di pengontrol tampilan bernama ConversionViewController, bagaimana saya mengatur tombol untuk mengubah warna latar belakang ketika disorot atau diketuk? Apakah saya akan mensubklasifikasikan setHIghlighted di COnversionViewController?
Beanno1116
Jadi ada satu masalah dengan jawaban ini yang saya temukan. Jika Anda ingin memiliki warna yang sama tersedia saat Anda memilih tombol, maka setHighlighted dipanggil setelah setSelected dan dengan demikian akan menimpa setiap styling yang dipilih yang Anda miliki. Solusi di atas mungkin lebih baik jika Anda ingin memilih tombol juga
HaloZero
3
@YakivKovalskiy dengan asumsi Anda menggunakan sub-kelas, Anda bisa menambahkan dua properti UIColor mis. NormalBackground dan highlightBackground, lalu tetapkan self.backgroundColor = normalBackground atau highlightBackground. Jangan lupa untuk menambahkan metode init untuk kemudahan penggunaan misalnya initWithBackground: highlightedBackground:
SK.
2
Solusi yang bagus, hanya satu saran:backgroundColor = isHighlighted ? .lightGray : .white
Fantini
298

Tidak yakin apakah ini memecahkan apa yang Anda cari, atau cocok dengan lanskap pengembangan umum Anda, tetapi hal pertama yang saya coba adalah mengubah warna latar tombol pada acara touchDown.

Pilihan 1:

Anda akan membutuhkan dua peristiwa untuk ditangkap, UIControlEventTouchDown adalah untuk saat pengguna menekan tombol. UIControlEventTouchUpInside dan UIControlEventTouchUpOutside akan digunakan ketika mereka melepaskan tombol untuk mengembalikannya ke keadaan normal.

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

Pilihan 2:

Kembalikan gambar yang dibuat dari warna highlight yang Anda inginkan. Ini juga bisa menjadi kategori.

+ (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;
}

dan kemudian ubah status tombol yang disorot:

[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];
Tim
sumber
3
Tambahkan UIControlEventTouchUpOutside dan UIControlEventTouchCancel ke tombolHighlight: daftar acara dan ini akan selalu berfungsi.
Evgen Bodunov
Opsi dua adalah yang terbaik yang saya temukan sejauh ini. Saya kira, bagaimanapun, storyboard memang memiliki kelebihan dalam hal ini!
Jack Solomon
Jawaban oleh Thomas lebih baik dan itulah yang saya gunakan juga
Van Du Tran
26
Jika Anda menggunakan layer.cornerRadiusdan menggunakan opsi # 2, Anda harus memastikan untuk mengatur clipsToBoundstrue untuk mendapatkan sudut gambar yang bulat juga.
Langit
3
Jika seseorang mampir dan membutuhkan jawaban di Swift: stackoverflow.com/questions/26600980/…
musim dingin
94

Tidak perlu mengganti highlightedsebagai properti yang dihitung. Anda dapat menggunakan pengamat properti untuk memicu perubahan warna latar belakang:

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

Cepat 4

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white
    }
}
Aleksejs Mjaliks
sumber
1
Saya tidak pernah menggunakan fungsionalitas seperti ini. Bisakah Anda menjelaskan kemana ini? Apakah ada di tombol IBActionTekan atau di viewDidLoad?
Dave G
Bagaimana jika saya memiliki beberapa UIButtons dengan warna berbeda?
Slavcho
6
@ Dave G, Anda membuat subkelas UIButton baru dengan mengklik File>New>File>Cocoa Touch Classdan mengaturnya subclass of UIButton. Beri nama file untuk ex CustomButton, yang akan menjadi nama file dan nama kelas. Di dalam file ini, masukkan override var highlightedkode yang ditunjukkan di atas. Langkah terakhir, atur UIButton pada Interface Builder untuk menggunakan CustomButtonsubclass ini dengan membuka halaman Properti di mana dikatakan "Kelas Kustom" dan memiliki kotak dropdown. Itu akan mengatakan "UIButton" dalam huruf abu-abu. Daftar dropdown akan menampilkan CustomButton. Pilih ini, dan tombol sekarang disubklasifikasikan.
James Toomey
Mengapa tidak ada yang menyebutkan bahwa penyetel dipanggil hanya ketika Anda mengetuk tombol, tetapi tidak selama tata letak awal! Jadi secara default tidak ada warna sampai Anda menyentuh tombol.
Dmitrii
Jadi untuk membuatnya bekerja, Anda juga perlu secara eksplisit memanggil isHighlighted = falsesuatu tempat di awal (misalnya inititialization).
Dmitrii
50

Ekstensi generik berguna di 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)
    }
}

Swift 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)
    }
}
Giordano Scalzo
sumber
45

Di Swift Anda dapat mengganti pengakses properti yang disorot (atau dipilih) daripada mengganti metode setHighlighted

override var highlighted: Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                backgroundColor = UIColor.blackColor()
            }
            else {
                backgroundColor = UIColor.whiteColor()
            }
            super.highlighted = newValue
        }
    }
Jake Hall
sumber
Ini benar-benar berfungsi, tapi saya bingung bagaimana Anda bisa mengetahuinya? Parameter tidak ada dalam dokumentasi atau UIButton.h sejauh yang saya tahu.
shimizu
1
Ini adalah sintaks cepat yang mengemulasi perilaku mengesampingkan setHightlighted dalam objektif c. Lihat dokumentasi tentang Computed Properties di sini developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Jake Hall
11
Dengan cepat Anda bisa menggunakan didSet
Dam
1
Saya telah menambahkan contoh dengan pengamat properti: stackoverflow.com/a/29186375/195173 .
Aleksejs Mjaliks
Saya pikir apa yang @shimizu tanyakan adalah bagaimana Anda tahu highlightedproperti di UIButton. Jawabannya adalah itu adalah properti di UIControl yang diwarisi dari UIButton.
Adam Johns
25

Ganti variabel yang disorot. Menambahkan @IBInspectablemembuat Anda mengedit backgroundColor yang disorot di storyboard, yang bagus juga.

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
        }
    }
}
mash
sumber
20

solusi yang lebih ringkas (berdasarkan jawaban @ aleksejs-mjaliks ):

Cepat 3/4 + :

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

Swift 2:

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

Jika Anda tidak ingin mengganti, ini adalah versi terbaru dari jawaban @ timur-bernikowich ( Swift 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)
  }
}
Federico Zanetello
sumber
@FedericoZanetello ini akan menggantikan isHighlighted di semua tombol di aplikasi Anda, yang bukan solusi yang baik menurut saya. sakit pergi dengan jawaban Timur.
Usama bin Attique
13

Ekstensi UIButton dengan sintaks Swift 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)
    }}

Gunakan seperti:

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

Jawaban Asli: https://stackoverflow.com/a/30604658/3659227

Maverick
sumber
10

Berikut pendekatan di Swift, menggunakan ekstensi UIButton untuk menambahkan IBInspectable, yang disebut highlightedBackgroundColor. Mirip dengan subclassing, tanpa memerlukan 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
                }
            }
        }
    }
}

Saya harap ini membantu.

Fostah
sumber
1
Untuk swift 2.0, Anda harus memperbarui panggilan ke objc_setAssociatedObject untuk menggunakan enum: objc_setAssociatedObject (self, & NormalBackgroundColorKey, newValue, .OBJC_ASSOCIATION_RETAIN)
Eli Burke
Cara terbaik di Swift jika Anda ingin menyimpan semuanya di Storyboard.
davidethell
1
Saya lebih suka menggunakan subclass bukan ekstensi karena ini akan memengaruhi seluruh aplikasi
Hossam Ghareeb
9

Solusi terbaik saya untuk Swift 3+ tanpa subclassing.

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

Dengan ekstensi ini, mudah untuk mengelola warna untuk status yang berbeda dan itu akan memudar warna normal Anda secara otomatis jika warna yang disorot tidak disediakan.

button.setBackgroundColor(.red, for: .normal)
Timur Bernikovich
sumber
4

MEMPERBARUI:

Gunakan perpustakaan UIButtonBackgroundColor Swift.

TUA:

Gunakan bantuan di bawah ini untuk membuat gambar 1 px x 1 px dengan warna isi abu-abu:

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

atau warna isi RGB:

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

Kemudian, gunakan itu imageuntuk mengatur gambar latar belakang tombol:

[button setBackgroundImage:image forState:UIControlStateNormal];

Pembantu

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

Catatan: ACUadalah awalan kelas dari Perpustakaan Static Cocoa Touch saya yang disebut Acani Utilities, di mana AC untuk Acani, dan U adalah untuk Utilitas.

ma11hew28
sumber
4

Coba ini !!!!

Untuk acara TouchedDown mengatur Satu warna dan untuk TouchUpInside mengatur yang lain.

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

- (IBAction)touchUpInside:(id)sender {
    NSLog(@"TouchUpInside");
    btn1.backgroundColor=[UIColor whiteColor];    
}
Karan Alangat
sumber
2
Bekerja untukku. Saya hanya perlu menambahkan - (IBAction)onButtonTouchDragOutside:(UIButton *)sender {untuk memastikan warna tidak tetap hidup ketika pengguna secara tidak sengaja menarik jarinya dari tombol.
SudoPlz
4

Subkelas UIButton dan tambahkan properti yang dapat diperiksa untuk penggunaan yang nyaman (ditulis dalam Swift 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
            }
        }
    }
}
Bence Pattogato
sumber
3

Anda dapat subkelas UIButton dan membuat forState yang bagus.

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

Catatan (Ini adalah contoh, saya tahu ada masalah dan di sini ada beberapa)

Saya telah menggunakan NSMutableDictionay untuk menyimpan UIColor untuk setiap negara bagian, saya harus melakukan konversi teks yang tidak menyenangkan untuk Key karena UIControlState bukan Int lurus yang bagus. Jika itu tempat Anda bisa init sebuah Array dengan banyak objek dan gunakan State sebagai indeks.

Karena ini Anda banyak mengalami kesulitan dengan misalnya tombol yang dipilih & dinonaktifkan, beberapa logika lebih diperlukan.

Masalah lain adalah jika Anda mencoba dan mengatur beberapa warna secara bersamaan, saya belum mencoba dengan tombol tetapi jika Anda dapat melakukan ini mungkin tidak bekerja

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

Saya berasumsi ini StoryBoard, tidak ada init, initWithFrame jadi tambahkan mereka jika Anda membutuhkannya.

Baja Daur Ulang
sumber
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)
    }

}

Swift 5 , terima kasih @Maverick

dengST30
sumber
3

Detail

  • Xcode 11.1 (11A1027), Swift 5

Larutan

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

Pemakaian

button.setBackground(.green, for: .normal)
Bodnarchuk dengan mudah
sumber
2

Coba ini jika Anda memiliki gambar:

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

atau lihat apakah showsTouchWhenHighlightedcukup untuk Anda.

Siby
sumber
Saya mencoba bermain-main dengan showsTouchWhenHighlighted tetapi tidak membantu. Saya tidak ingin menggunakan setBackgroundImage: forState :. Saya sebenarnya mencoba menggunakan backgroundColor untuk tidak menggunakan gambar apa pun.
MartinMoizard
2

Saya telah open-source subclass UIButton, STAButton , untuk mengisi lubang fungsionalitas yang menganga ini. Tersedia di bawah lisensi MIT. Bekerja untuk iOS 7+ (Saya belum menguji dengan versi iOS yang lebih lama).

Stunner
sumber
2

Untuk mengatasi masalah ini, saya membuat Kategori untuk menangani backgroundColorNegara dengan UIButtons:
ButtonBackgroundColor-iOS

Anda dapat menginstal kategori sebagai pod .

Mudah digunakan dengan Objective-C

@property (nonatomic, strong) UIButton *myButton;

...

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

Bahkan lebih mudah digunakan dengan Swift :

import ButtonBackgroundColor

...

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

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

Saya sarankan Anda mengimpor pod dengan:

platform :ios, '8.0'
use_frameworks!

pod 'ButtonBackgroundColor', '~> 1.0'

Menggunakan use_frameworks! di Podfile Anda membuatnya lebih mudah untuk menggunakan pod Anda dengan Swift dan objektif-C.

PENTING

Saya juga menulis Posting Blog dengan informasi lebih lanjut.

Gabriel.Massana
sumber
2
class CustomButton: UIButton {

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

}
evya
sumber
2

Gunakan https://github.com/swordray/UIButtonSetBackgroundColorForState

Tambahkan ke Podfile menggunakan CocoaPods

pod "UIButtonSetBackgroundColorForState"

Cepat

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

Objektif-C

[button setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];
pedang pendek
sumber
1

Coba tintColor:

_button.tintColor = [UIColor redColor];
jjv360
sumber
Apakah Anda yakin itu tertaut di IB? Apa yang Anda dapatkan jika melakukannya NSLog(@"%@", _button);?
jjv360
1
Ini tidak akan berfungsi jika Anda menggunakan a UIButtonTypeCustom.
JaredH
1

Berikut adalah kode dalam Swift untuk memilih status tombol:

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

Contoh:

    self.button.setImage(self.imageWithColor(UIColor.blackColor()), forState: .Highlighted)
Mike Zriel
sumber
1

Jatuhkan dan Anda siap:
* proerty dapat diatur dalam IB, dan jika tidak ada latar belakang yang disorot diatur, latar belakang tidak akan berubah ketika ditekan

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
        }
    }
}
sepatu
sumber
1

UIIImageEkstensi di bawah ini akan menghasilkan objek gambar dengan parameter warna yang ditentukan.

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

Contoh penggunaan untuk tombol dapat diterapkan untuk objek tombol sebagai:

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)
manoj kumar
sumber
1

sederhananya yang menggunakan UIButton Extension itu HANYA

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

}

dan gunakan ini

 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)
Muhammad Ahmad
sumber
0

jika Anda tidak akan mengesampingkan hanya mengatur dua tindakan touchDown touchUpInside

Roman Bambura
sumber
0

Swift 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)
    }
}
Elita
sumber
0

dalam Swift 5

Bagi mereka yang tidak ingin menggunakan latar belakang berwarna untuk mengalahkan negara yang dipilih

Cukup Anda dapat mengatasi masalah dengan menggunakan #Selector & if statement untuk mengubah warna UIButton untuk masing-masing negara secara mudah

Sebagai contoh:

    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

    }
}
Biarkan. Kimoo
sumber