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?


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

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

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

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

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

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

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

@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


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.


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)

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.


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

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

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.


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


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)

2

Coba ini jika Anda memiliki gambar:

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

atau lihat apakah showsTouchWhenHighlightedcukup untuk Anda.


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


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.


2
class CustomButton: UIButton {

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

}


1

Coba tintColor:

_button.tintColor = [UIColor redColor];

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)

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

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)

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)

0

jika Anda tidak akan mengesampingkan hanya mengatur dua tindakan touchDown touchUpInside


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

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

    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.