Làm cách nào để thay đổi màu nền của UIButton trong khi tô sáng?


235

Tại một số điểm trong ứng dụng của tôi, tôi có một điểm nhấn UIButton(ví dụ: khi người dùng có ngón tay trên nút) và tôi cần thay đổi màu nền trong khi nút được tô sáng (vì vậy trong khi ngón tay của người dùng vẫn ở trên nút) .

Tôi đã thử như sau:

_button.backgroundColor = [UIColor redColor];

Nhưng nó không hoạt động. Màu sắc vẫn giữ nguyên. Tôi đã thử cùng một đoạn mã khi nút không được tô sáng và nó hoạt động tốt. Tôi cũng đã thử gọi -setNeedsDisplaysau khi thay đổi màu sắc, nó không có tác dụng gì.

Làm thế nào để buộc nút thay đổi màu nền?


Câu trả lời:


411

Bạn có thể ghi đè UIButton's setHighlightedphương pháp.

Mục tiêu-C

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

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

Swift 3.0 và Swift 4.1

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

Vâng. Đó là một cách tốt đẹp để làm điều này. Bởi vì bạn có thể định nghĩa một số nút tương tự.
Paul Brewczynski

3
Chỉ cần một câu hỏi cho người mới, bạn sẽ phân lớp phương thức nút đó ở đâu? Nếu tôi có một nút trong trình điều khiển chế độ xem có tên là ConversViewContaptor, làm cách nào để thiết lập nút thay đổi màu nền khi được tô sáng hoặc gõ? Tôi có thể phân lớp setHIghlighted trong COnversionViewControll không?
Beanno1116

Vì vậy, có một vấn đề với câu trả lời này mà tôi tìm thấy. Nếu bạn muốn có cùng màu có sẵn khi bạn chọn Nút, sau đó setHighlighted được gọi sau setSelected và do đó sẽ ghi đè lên bất kỳ kiểu dáng đã chọn nào bạn có. Giải pháp trên có thể tốt hơn nếu bạn cũng muốn chọn nút này
HaloZero

3
@YakivKovalskiy giả sử bạn đang sử dụng một lớp con, bạn có thể thêm hai thuộc tính UIColor, ví dụ: normalBackground và highlightBackground, sau đó gán self.backgroundColor = normalBackground hoặc highlightBackground tương ứng. Đừng quên thêm một phương thức init để dễ sử dụng, ví dụ initWithBackground: highlightBackground:
SK.

2
Giải pháp hay, chỉ một gợi ý:backgroundColor = isHighlighted ? .lightGray : .white
Fantini

298

Không chắc loại này có giải quyết được những gì bạn đang theo dõi hay phù hợp với bối cảnh phát triển chung của bạn hay không, nhưng điều đầu tiên tôi sẽ thử là thay đổi màu nền của nút trong sự kiện touchDown.

Lựa chọn 1:

Bạn sẽ cần hai sự kiện để được ghi lại, UIControlEventTouchDown sẽ dành cho khi người dùng nhấn nút. UIControlEventTouchUpInside và UIControlEventTouchUpOutside sẽ dành cho khi họ nhả nút để đưa nó trở lại trạng thái bình thường

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

Lựa chọn 2:

Trả lại một hình ảnh được làm từ màu nổi bật bạn muốn. Đây cũng có thể là một thể loại.

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

và sau đó thay đổi trạng thái được tô sáng của nút:

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

3
Thêm UIControlEventTouchUpOutside và UIControlEventTouch Hủy vào nútHighlight: danh sách sự kiện và nó sẽ hoạt động luôn.
Evgen Bodunov

Lựa chọn hai là tốt nhất mà tôi đã tìm thấy cho đến nay. Tôi đoán, tuy nhiên, bảng phân cảnh có lợi thế của họ trong trường hợp này!
Jack Solomon

Trả lời bởi Thomas là tốt hơn và đó cũng là những gì tôi sử dụng
Van Du Tran

26
Nếu bạn đang sử dụng layer.cornerRadiusvà sử dụng tùy chọn # 2, bạn sẽ cần đảm bảo đặt clipsToBoundsthành đúng để làm cho các góc của hình ảnh được làm tròn.
Bầu trời

3
Nếu ai đó dừng lại và cần câu trả lời trong Swift: stackoverflow.com/questions/26600980/
mùa đông

94

Không cần ghi đè highlightedlà tài sản tính toán. Bạn có thể sử dụng trình quan sát thuộc tính để kích hoạt thay đổi màu nền:

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

Swift 4

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

1
Tôi chưa bao giờ sử dụng chức năng như thế này. Bạn có thể giải thích điều này đi đâu? Có phải trong chức năng nút IBAction hoặc trong viewDidLoad?
Dave G

Nếu tôi có nhiều UIButtons với các màu khác nhau thì sao?
Slavcho

6
@Dave G, bạn tạo một lớp con mới của UIButton bằng cách nhấp File>New>File>Cocoa Touch Classvà đặt nó vào subclass of UIButton. Đặt tên tệp cho ex CustomButton, sẽ trở thành cả tên tệp và tên lớp. Trong tập tin này, đặt override var highlightedmã hiển thị ở trên. Bước cuối cùng, đặt UIButton trên Trình tạo giao diện để sử dụng CustomButtonlớp con này bằng cách truy cập trang Thuộc tính nơi có "Lớp tùy chỉnh" và có hộp thả xuống. Nó sẽ nói "UIButton" bằng chữ màu xám. Danh sách thả xuống sẽ hiển thị CustomButton. Chọn cái này và nút bây giờ được phân lớp.
James Toomey

Tại sao không ai đề cập rằng setter chỉ được gọi khi bạn nhấn nút, nhưng không phải trong bố cục ban đầu! Vì vậy, theo mặc định không có màu cho đến khi bạn chạm vào nút.
Dmitrii

Vì vậy, để làm cho nó hoạt động, bạn cũng cần phải gọi một cách rõ ràng isHighlighted = falseở đâu đó ngay từ đầu (ví dụ về khởi xướng).
Dmitrii

48

Một tiện ích mở rộng chung tiện dụng trong 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

Trong Swift, bạn có thể ghi đè trình truy cập của thuộc tính được tô sáng (hoặc đã chọn) thay vì ghi đè phương thức setHighlighted

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

Điều này hoàn toàn hiệu quả, nhưng tôi bối rối làm thế nào bạn có thể tìm ra điều này? Các tham số không có trong tài liệu hoặc UIButton.h theo như tôi có thể nói.
shimizu

1
Đây là cú pháp nhanh chóng mô phỏng hành vi ghi đè setHightlighted trong mục tiêu c. Xem tài liệu về Thuộc tính được tính toán tại đây developer.apple.com/l
Jake Hall

11
Trong swift, bạn có thể sử dụng did Set
Dam

1
Tôi đã thêm ví dụ với trình quan sát thuộc tính: stackoverflow.com/a/29186375/195173 .
Aleksejs Mjaliks

Tôi nghĩ những gì @shimizu đã hỏi là làm sao bạn biết highlightedlà một tài sản trên UIButton. Câu trả lời là đây là một tài sản trên UIControl mà UIButton thừa hưởng.
Adam Johns

25

Ghi đè biến được tô sáng. Thêm @IBInspectablelàm cho bạn chỉnh sửa nền được tô sáng trong bảng phân cảnh, điều này cũng tiện lợi.

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

một giải pháp nhỏ gọn hơn (dựa trên câu trả lời @ aleksejs-mjaliks ):

Swift 3/4 + :

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

Swift 2:

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

Nếu bạn không muốn ghi đè, đây là phiên bản cập nhật của câu trả lời của @ 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 điều này sẽ ghi đè lên Được đánh dấu trong tất cả các nút trong ứng dụng của bạn, đây không phải là một giải pháp tốt theo quan điểm của tôi. xấu đi với câu trả lời của Timur.
Usama bin Attique

13

Tiện ích mở rộng UIButton với cú pháp 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)
    }}

Sử dụng nó như:

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

Câu trả lời gốc: https://stackoverflow.com/a/30604658/3659227


10

Đây là một cách tiếp cận trong Swift, sử dụng tiện ích mở rộng UIButton để thêm IBInspectable, được gọi là highlightBackgroundColor. Tương tự như phân lớp, không yêu cầu phân lớp.

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

Tôi hi vọng cái này giúp được.


1
Cho nhanh 2.0, bạn sẽ cần phải cập nhật các cuộc gọi đến objc_setAssociatedObject sử dụng một enum: objc_setAssociatedObject (bản thân, & NormalBackgroundColorKey, newValue, .OBJC_ASSOCIATION_RETAIN)
Eli Burke

Chắc chắn là cách tốt nhất trong Swift nếu bạn muốn giữ tất cả trong Storyboard.
davidethell

1
Tôi thích sử dụng lớp con không phải tiện ích mở rộng vì điều này sẽ ảnh hưởng đến toàn bộ ứng dụng
Hossam Ghareeb


9

Giải pháp tốt nhất của tôi cho Swift 3+ mà không cần phân lớp.

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

Với tiện ích mở rộng này, thật dễ dàng để quản lý màu cho các trạng thái khác nhau và nó sẽ tự động làm mờ màu bình thường của bạn trong trường hợp màu được tô sáng không được cung cấp.

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

4

CẬP NHẬT:

Sử dụng thư viện UIButtonBackgroundColor Swift.

CŨ:

Sử dụng các trợ giúp bên dưới để tạo hình ảnh 1 px x 1 px với màu tô màu xám:

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

hoặc màu tô RGB:

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

Sau đó, sử dụng nó imageđể đặt hình nền của nút:

[button setBackgroundImage:image forState:UIControlStateNormal];

Người giúp việc

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

Lưu ý: ACUlà tiền tố lớp của Thư viện tĩnh Ca cao cảm ứng của tôi có tên là Acani Utility, trong đó AC dành cho Acani và U dành cho Tiện ích.


4

Thử cái này !!!!

Đối với TouchedDown Event, đặt một màu và cho TouchUpInside đặt màu khác.

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

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

2
Đã làm cho tôi. Tôi chỉ cần thêm - (IBAction)onButtonTouchDragOutside:(UIButton *)sender {để đảm bảo màu không còn khi người dùng vô tình kéo ngón tay ra khỏi nút.
SudoPlz

4

Phân lớp UIButton và thêm các thuộc tính có thể kiểm tra để sử dụng thuận tiện (được viết bằng 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

Bạn có thể phân lớp UIButton và tạo một forState đẹp.

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

Ghi chú (Đây là một ví dụ, tôi biết có vấn đề và đây là một số)

Tôi đã sử dụng NSMutableDictionay để lưu trữ UIColor cho mỗi Bang, tôi phải thực hiện chuyển đổi văn bản khó chịu cho Khóa vì UIControlState không phải là một Int thẳng đẹp. Nếu đó là nơi bạn có thể khởi tạo một Mảng có nhiều đối tượng đó và sử dụng Trạng thái làm chỉ mục.

Do đó, nhiều bạn gặp khó khăn với ví dụ như nút được chọn và bị vô hiệu hóa, cần thêm một số logic.

Một vấn đề khác là nếu bạn thử và đặt nhiều màu cùng một lúc, tôi đã không thử bằng một nút nhưng nếu bạn có thể làm điều này thì nó có thể không hoạt động

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

Tôi đã giả sử đây là StoryBoard, không có init, initWithFrame vì vậy hãy thêm chúng nếu bạn cần chúng.


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 , cảm ơn @Maverick


3

Chi tiết

  • Xcode 11.1 (11A1027), Swift 5

Giải pháp

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

Sử dụng

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

2

Hãy thử điều này nếu bạn có một hình ảnh:

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

hoặc xem nếu showsTouchWhenHighlightedlà đủ cho bạn.


Tôi đã thử chơi xung quanh với showsTouchWhenHighlighted nhưng không được. Tôi không muốn sử dụng setBackgroundImage: forState :. Trong thực tế, tôi đã cố gắng sử dụng nềnColor để không sử dụng bất kỳ hình ảnh.
MartinMoizard

2

Tôi đã mở nguồn một lớp con UIButton, STAButton , để điền vào lỗ chức năng gaping này. Có sẵn theo giấy phép MIT. Hoạt động cho iOS 7+ (Tôi chưa thử nghiệm với các phiên bản iOS cũ hơn).


2

Để giải quyết vấn đề này, tôi đã tạo một Danh mục để xử lý các trạng thái backgroundColorvới UIButtons:
ButtonBackgroundColor-iOS

Bạn có thể cài đặt danh mục như một nhóm .

Dễ dàng sử dụng với Objective-C

@property (nonatomic, strong) UIButton *myButton;

...

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

Thậm chí dễ sử dụng hơn với Swift :

import ButtonBackgroundColor

...

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

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

Tôi khuyên bạn nên nhập nhóm với:

platform :ios, '8.0'
use_frameworks!

pod 'ButtonBackgroundColor', '~> 1.0'

Sử dụng use_frameworks! trong Podfile của bạn giúp sử dụng nhóm của bạn dễ dàng hơn với Swift và object-C.

QUAN TRỌNG

Tôi cũng đã viết một bài Blog với nhiều thông tin hơn.


2
class CustomButton: UIButton {

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

}


1

Hãy thử tintColor:

_button.tintColor = [UIColor redColor];

Bạn có chắc chắn nó được liên kết trong IB? Bạn nhận được gì nếu bạn làm gì NSLog(@"%@", _button);?
jjv360

1
Điều này sẽ không hoạt động nếu bạn đang sử dụng một UIButtonTypeCustom.
JaredH

1

Đây là mã trong Swift để chọn trạng thái nút:

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

Thí dụ:

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

1

Thả nó vào và bạn vẫn ổn:
* proerty có thể được đặt trong IB và nếu không có nền được tô sáng nào, nền sẽ không thay đổi khi nhấn

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

Bên dưới UIIImagephần mở rộng sẽ tạo đối tượng hình ảnh với tham số màu được chỉ định.

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

Một ví dụ sử dụng cho một nút có thể được áp dụng cho đối tượng nút như:

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

đơn giản là chỉ sử dụng phần mở rộng UIButton đó

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

}

và sử dụng cái này

 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

nếu bạn không ghi đè, chỉ cần đặt hai hành động 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

trong Swift 5

Đối với những người không muốn sử dụng nền màu để đánh bại trạng thái đã chọn

Đơn giản là bạn có thể đánh bại vấn đề bằng cách sử dụng câu lệnh #Selector & if để thay đổi màu UIButton cho từng trạng thái một cách dễ dàng

Ví dụ:

    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

    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.