Vurgulanırken bir UIButton'un arka plan rengi nasıl değiştirilir?


236

Uygulamamın bir noktasında vurgulanırım UIButton(örneğin, kullanıcının parmağı düğmede olduğunda) ve düğme vurgulanırken arka plan rengini değiştirmem gerekir (böylece kullanıcının parmağı hala düğmedeyken) .

Aşağıdakileri denedim:

_button.backgroundColor = [UIColor redColor];

Ama bu çalışmıyor. Renk aynı kalır. Düğme vurgulanmadığında aynı kod parçasını denedim ve iyi çalışıyor. Ayrıca -setNeedsDisplayrengi değiştirdikten sonra aramayı denedim , herhangi bir etkisi olmadı.

Düğmeyi arka plan rengini değiştirmeye zorlamak nasıl?


Yanıtlar:


411

Sen geçersiz kılabilirsiniz UIButtonbireyin setHighlightedyöntemi.

Objective-C

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

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

Swift 3.0 ve Swift 4.1

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

Evet. Bunu yapmanın güzel bir yolu. Çünkü birkaç benzer düğme tanımlayabilirsiniz.
Paul Brewczynski

3
Sadece acemi bir soru, bu düğme yöntemini nereden alt sınıflara ayırırsınız? ConversionViewController adlı bir görünüm denetleyicisinde bir düğme varsa, vurgulandığında veya hafifçe vurulduğunda arka plan rengini değiştirmek için düğmeyi nasıl ayarlarım? COnversionViewController içinde setHIghlighted alt sınıfını?
Beanno1116

Yani bulduğum bu cevapla ilgili bir sorun var. Düğmeyi seçtiğinizde aynı rengin olmasını istiyorsanız, setHellighted setSelected öğesinden sonra çağrılır ve böylece sahip olduğunuz seçili stilleri geçersiz kılar. Düğmeyi de seçmek istiyorsanız yukarıdaki çözüm daha iyi olabilir
HaloZero

3
@YakivKovalskiy, bir alt sınıf kullandığınızı varsayarsak, normalBackground ve highlightedBackground gibi iki UIColor özelliği ekleyebilir, ardından self.backgroundColor = normalBackground veya highlightedBackground öğesini buna göre atayabilirsiniz. Kullanım kolaylığı için bir init yöntemi eklemeyi unutmayın, örneğin initWithBackground: highlightedBackground:
SK.

2
Güzel bir çözüm, sadece bir öneri:backgroundColor = isHighlighted ? .lightGray : .white
Fantini

298

Bu türden sonra ne çözdüğünüzden emin değilseniz ya da genel geliştirme ortamınıza uyup uymadığından emin değilim ama ilk deneyeceğim şey, touchDown olayındaki düğmenin arka plan rengini değiştirmek olacaktır.

Seçenek 1:

Yakalamak için iki olaya ihtiyacınız olacak, UIControlEventTouchDown kullanıcı düğmeye bastığında olacaktır. UIControlEventTouchUpInside ve UIControlEventTouchUpOutside, düğmeyi normal duruma döndürmek için bıraktıklarında kullanılacak

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

Seçenek 2:

İstediğiniz vurgu renginden yapılmış bir görüntü döndürün. Bu bir kategori de olabilir.

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

ve düğmenin vurgulanan durumunu değiştirin:

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

3
ButtonHighlight: event listesine UIControlEventTouchUpOutside ve UIControlEventTouchCancel ekleyin ve her zaman çalışır.
Evgen Bodunov

İkinci seçenek şimdiye kadar bulduğum en iyisidir. Ancak sanırım, storyboard'ların bu durumda avantajları var!
Jack Solomon

Thomas tarafından cevap daha iyi ve ben de bunu kullanıyorum
Van Du Tran

26
layer.cornerRadius2. seçeneği kullanıyorsanız ve devam ediyorsanız clipsToBounds, görüntünün köşelerini de yuvarlamak için true değerine ayarladığınızdan emin olmanız gerekir .
Sky

3
Birisi tarafından durur ve Swift bir cevap gerekiyorsa: stackoverflow.com/questions/26600980/...
winterized

94

highlightedHesaplanan özellik olarak geçersiz kılmaya gerek yoktur . Arka plan rengi değişikliğini tetiklemek için özellik gözlemcisini kullanabilirsiniz:

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

Hızlı 4

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

1
Hiç böyle bir işlevsellik kullanmadım. Bunun nereye gittiğini açıklayabilir misiniz? IBAction buttonPress işlevinde mi yoksa viewDidLoad'da mı?
Dave G

Farklı renklerde birden fazla UIButtonum varsa ne olur?
Slavcho

6
@Dave G, tıklayarak File>New>File>Cocoa Touch Classve ayarlayarak yeni bir UIButton alt sınıfı oluşturursunuz subclass of UIButton. Dosyayı ex olarak adlandırın CustomButton; bu dosya hem dosya adı hem de sınıf adı olur. Bu dosyanın içine, override var highlightedyukarıda gösterilen kodu koyun . Son adım, Arayüz Oluşturucu'daki UIButton'u, CustomButton"Özel Sınıf" yazdığı ve bir açılır kutunun bulunduğu Özellik sayfasına giderek bu alt sınıfı kullanacak şekilde ayarlayın . Gri harflerle "UIButton" diyecektir. Açılır listede CustomButton gösterilmelidir. Bunu seçin, düğme şimdi alt sınıflıdır.
James Toomey

Neden kimse ayarlayıcının sadece düğmeye dokunduğunuzda çağrıldığını söylemedi, ancak ilk düzen sırasında değil! Bu nedenle, varsayılan olarak düğmeye dokunana kadar renk yoktur.
Dmitrii

Bu nedenle, çalışması isHighlighted = falseiçin başlangıçta bir yere açıkça çağırmanız gerekir (örneğin başlatma sırasında).
Dmitrii

49

Swift'te kullanışlı bir genel uzantı:

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

Swift'te, setHighlighted yöntemini geçersiz kılmak yerine vurgulanan (veya seçili) özelliğin erişimcisini geçersiz kılabilirsiniz

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

Bu tamamen işe yarıyor, ama bunu nasıl anlayabileceğiniz konusunda kafam karıştı? Parametreler, anlatabildiğim kadarıyla belgelerde veya UIButton.h'de değil.
shimizu

1
Bu, hedef c'de belirtilen setHightlighted'i geçersiz kılma davranışını taklit eden hızlı sözdizimidir. Computed Properties ile ilgili belgelere buradan ulaşabilirsiniz developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Jake Hall

11
Hızlı bir şekilde didSet
Dam

1
Özellik gözlemcisi ile örnek ekledim: stackoverflow.com/a/29186375/195173 .
Aleksejs Mjaliks

@Shimizu'nun sorduğu şey highlighted, UIButton'da bir mülk olduğunu nasıl bildin diye düşünüyorum . Yanıt, UIButton'un miras aldığı UIControl'de bir özellik olmasıdır.
Adam Johns

25

Vurgulanan değişkeni geçersiz kıl. Eklemek @IBInspectable, vurgulanan backgroundColor'u film şeridinde düzenlemenizi sağlar, ki bu da şıktır.

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

daha kompakt bir çözüm ( @ aleksejs-mjaliks yanıtına dayanarak ):

Swift 3/4 + :

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

Hızlı 2:

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

Geçersiz kılmak istemiyorsanız, bu @ timur-bernikowich'in cevabının güncellenmiş bir versiyonudur ( 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, geçersiz kılar, uygulamanızdaki tüm düğmelerde vurgulanır, bu benim görüşüme göre iyi bir çözüm değildir. Timur'un cevabı ile gideceğim.
Usama bin Attique

13

Swift 3+ sözdizimi ile UIButton uzantısı :

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

Gibi kullanın:

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

Orijinal Yanıt: https://stackoverflow.com/a/30604658/3659227


10

Swift'te, vurgulananBackgroundColor adı verilen bir IBInspectable eklemek için bir UIButton uzantısı kullanan bir yaklaşım. Alt sınıfa gerek olmadan, alt sınıfa benzer.

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

Umarım bu yardımcı olur.


1
Hızlı 2.0 için, bir enum kullanmak için objc_setAssociatedObject çağrısını güncellemeniz gerekir: objc_setAssociatedObject (self, & NormalBackgroundColorKey, newValue, .OBJC_ASSOCIATION_RETAIN)
Eli Burke

Hepsini Storyboard'da tutmak istiyorsanız Swift'te kesinlikle en iyi yol.
davidethell

1
Bu tüm uygulamayı etkileyeceği için alt sınıf uzantısını kullanmayı tercih ediyorum
Hossam Ghareeb


9

Alt sınıflama olmadan Swift 3+ için en iyi çözümüm .

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

Bu uzantı ile renkleri farklı durumlar için yönetmek kolaydır ve vurgulanan renk sağlanmadığı takdirde normal renginizi otomatik olarak soldurur.

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

4

GÜNCELLEME:

UIButtonBackgroundColor Swift kitaplığını kullanın .

ESKİ:

Gri tonlamalı dolgu rengiyle 1 piksel x 1 piksel görüntü oluşturmak için aşağıdaki yardımcıları kullanın:

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

veya bir RGB dolgu rengi:

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

Ardından, imagedüğmenin arka plan resmini ayarlamak için bunu kullanın:

[button setBackgroundImage:image forState:UIControlStateNormal];

Yardımcılar

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

Not: ACUKakao Dokunuş Statik Kütüphanemin Acani Yardımcı Programları adlı AC'nin Acani ve U'nun Yardımcı Programlar için olduğu sınıf önekidir.


4

Bunu dene !!!!

TouchedDown Olay kümesi için Bir renk ve TouchUpInside için diğerini ayarlayın.

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

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

2
Benim için çalıştı. - (IBAction)onButtonTouchDragOutside:(UIButton *)sender {Kullanıcı yanlışlıkla parmağını düğmeden sürüklediğinde rengin açık kalmamasını sağlamak için eklemem gerekiyordu.
SudoPlz

4

UIButton'u alt sınıflayın ve rahat kullanım için denetlenebilir özellikler ekleyin (Swift 3.0'da yazılmıştır):

final class SelectableBackgroundButton: UIButton {

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

    @IBInspectable
    var animatedColorChange: Bool = true

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

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

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

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

3

UIButton'u alt sınıflandırabilir ve forState için hoş bir şey yapabilirsiniz.

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

Notlar (Bu bir örnek, sorunların olduğunu biliyorum ve işte bazıları)

Her Eyalet için UIColor saklamak için bir NSMutableDictionay kullandım, UIControlState hoş bir düz Int değil gibi Anahtar için kötü bir metin dönüştürme yapmak zorunda. Eğer bu kadar çok nesne ile bir Array başlatabilir ve Devlet dizin olarak kullanabilirsiniz.

Bu nedenle, birçoğunuz seçili ve devre dışı bırakılmış bir düğme ile zorluklarınız var, biraz daha mantık gerekiyor.

Başka bir sorun, aynı anda birden fazla renk denemeniz ve ayarlamanız durumunda, bir düğme ile denemedim, ancak bunu yapabilirseniz işe yaramayabilir.

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

Bunun StoryBoard olduğunu varsaydım, init, initWithFrame yok, bu yüzden onlara ihtiyacınız varsa ekleyin.


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 , teşekkürler @Maverick


3

ayrıntılar

  • Xcode 11.1 (11A1027), Swift 5

Çözüm

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

kullanım

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

2

Bir resminiz varsa bunu deneyin:

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

veya showsTouchWhenHighlightedsizin için yeterli olup olmadığına bakın.


ShowTouchWhenHighlighted ile oynamayı denedim ama yardımcı olmadı. SetBackgroundImage: forState: kullanmak istemiyorum. Aslında herhangi bir görüntü kullanmamak için backgroundColor kullanmaya çalışıyordum.
MartinMoizard

2

Bu boşluk işlevselliği deliğini doldurmak için açık kaynaklı bir UIButton alt sınıfı STAButton var . MIT lisansı altında bulunur. İOS 7+ için çalışır (Eski iOS sürümleriyle test etmedim).


2

Bu sorunu çözmek için backgroundColorDurumları ele almak için bir Kategori oluşturdum UIButtons:
ButtonBackgroundColor-iOS

Kategoriyi bir kapsül olarak yükleyebilirsiniz .

Objective-C ile kullanımı kolay

@property (nonatomic, strong) UIButton *myButton;

...

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

Swift ile kullanımı daha da kolay :

import ButtonBackgroundColor

...

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

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

Bölmeyi aşağıdakilerle içe aktarmanızı öneririm:

platform :ios, '8.0'
use_frameworks!

pod 'ButtonBackgroundColor', '~> 1.0'

Use_frameworks kullanma! Pod dosyasında, bölmelerinizi Swift ve objektif-C ile kullanmayı kolaylaştırır.

ÖNEMLİ

Ayrıca daha fazla bilgi içeren bir Blog Yazısı yazdım.


2
class CustomButton: UIButton {

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

}


1

Deneyin tintColor:

_button.tintColor = [UIColor redColor];

IB'de bağlantılı olduğundan emin misiniz? Yaparsan ne alırsın NSLog(@"%@", _button);?
jjv360

1
A kullanıyorsanız bu işe yaramaz UIButtonTypeCustom.
JaredH

1

Swift'te düğme durumu için seçilecek kod:

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

Misal:

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

1

Bırakın ve gitmeye hazırsınız:
* IB'de proerty ayarlanabilir ve vurgulanan arka plan ayarlanmadıysa, basıldığında arka plan değişmez

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

Aşağıdaki UIIImageuzantı belirtilen renk parametresine sahip görüntü nesnesi oluşturur.

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

Düğme nesnesine bir düğme için örnek kullanım uygulanabilir:

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

basit bu SADECE UIButton Uzantısı kullanın

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

}

ve bunu kullan

 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

geçersiz kılmayacaksanız sadece iki eylem ayarlayın touchDown touchUpInside


0

Hızlı 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

Swift 5'te

Seçilen durumu yenmek için renkli arka plan kullanmak istemeyenler için

Her durum için UIButton renklerini ayrı ayrı kolayca değiştirmek için #Selector & if deyimini kullanarak sorunu yenebilirsiniz.

Örneğin:

    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

    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.