UIButton bị vô hiệu hóa không bị phai hoặc màu xám


135

Trong ứng dụng iPhone của tôi, tôi có một UIButton mà tôi đã tạo trong Trình tạo giao diện. Tôi có thể kích hoạt và vô hiệu hóa nó như thế này trong mã của mình ...

sendButton.enabled = YES;

hoặc là

sendButton.enabled = NO;

Tuy nhiên, giao diện trực quan của nút luôn giống nhau! Nó không bị phai hay xám. Nếu tôi cố gắng nhấp vào nó, nó được kích hoạt hoặc vô hiệu hóa như mong đợi. Tui bỏ lỡ điều gì vậy? Nó không nên trông nhạt nhòa hay xám xịt?


Bạn có đang sử dụng hình ảnh với UIButton của mình không?
Jhaliya

Không, nó không, bạn sẽ cần phải thiết lập alpha của nó, theo đó, nó sẽ hoạt động.
Ravin

Câu trả lời:


187

Bạn có thể sử dụng mã sau đây:

sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;

12
Trong khi điều này hoạt động tôi nghĩ rằng các giải pháp thay đổi giao diện tùy thuộc vào trạng thái kiểm soát như thế nàyđiều này từ bên dưới là một ý tưởng tốt hơn nhiều. Họ đang sử dụng cơ chế tích hợp để đạt được thay đổi tự động, thay vì cần cập nhật rõ ràng giao diện của điều khiển tùy thuộc vào trạng thái của nó.
Stewohn

78

chỉ cần thay đổi cấu hình trạng thái để tắt và chọn những gì bạn muốn, hình ảnh nền cho trạng thái bị vô hiệu hóa

nhập mô tả hình ảnh ở đây


13
Điều này chỉ thay đổi thuộc tính trong tiêu đề phụ Nút . Màu nền nằm dưới tiêu đề Xem , do đó không bị thay đổi bởi cấu hình trạng thái.
Thợ săn Hunter

2
Điều này không làm việc cho màu nền của xem. Trong dự án của tôi, tôi đã kết hợp câu trả lời trước đó và điều này.
Anton

40

Một tùy chọn khác là thay đổi màu văn bản (ví dụ sang màu xám nhạt) cho trạng thái bị tắt.

Trong trình chỉnh sửa bảng phân cảnh, chọn Disabledtừ State Confignút bật lên. Sử dụng Text Colornút bật lên để thay đổi màu văn bản.

Trong mã, sử dụng -setTitleColor:forState:tin nhắn.


Đây có vẻ là một giải pháp tốt hơn nhiều so với câu trả lời bị loại trừ về việc điều chỉnh alpha. Tôi đã bỏ phiếu này từ nhiều tháng trước và bây giờ tôi trở lại đây với cùng một vấn đề, tôi ước tôi có thể làm lại!
Stewohn

Đúng, dường như là một giải pháp làm việc. Tôi chỉ sử dụng màu xám nhạt.
atereshkov

23

Cố gắng đặt các hình ảnh khác nhau cho UIControlStateDisabled(hình ảnh màu xám bị vô hiệu hóa) và UIControlStateNormal(Hình ảnh bình thường) để nút tạo trạng thái bị vô hiệu hóa cho bạn.


2
anh ấy không sử dụng hình ảnh - nhưng bạn có thể áp dụng khái niệm tương tự này [ UIButton setAttributedTitle:forState:]. Tạo chuỗi được gán của bạn trong đó màu nền trước văn bản của bạn được đặt thành màu trong suốt.
nielsbot

20

Để làm cho nút bị mờ khi tắt, bạn có thể đặt alpha cho nó. Có hai lựa chọn cho bạn:

Cách thứ nhất : Nếu bạn muốn áp dụng cho tất cả các nút trong ứng dụng của mình, vì vậy bạn có thể viết extensioncho UIButton như thế này:

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

Cách thứ hai : Nếu bạn chỉ muốn áp dụng cho một số nút trong ứng dụng của mình, vì vậy bạn có thể viết một lớp tùy chỉnh từ UIButton như bên dưới và sử dụng lớp này mà bạn muốn áp dụng:

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}

13

Nếu bạn sử dụng nút văn bản, bạn có thể đưa vào viewDidLoad phương thức cá thể

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

thí dụ:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];

1
Đây phải là câu trả lời được chấp nhận cho một nút văn bản .. Câu trả lời được chấp nhận hiện tại là tốt cho một nút hình ảnh. Những gì tôi nhận được từ ý kiến ​​của op là anh ta có một nút văn bản ..
Ali Hus

11

Bạn có thể sử dụng adjustsImageWhenDisabledtài sản củaUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ví dụ:

 Button.adjustsImageWhenDisabled = false

2
Cái đó làm cái gì? Bạn có thể giải thích tại sao anh ta nên sử dụng nó?
Zippy

7

Đây là một câu hỏi khá cũ nhưng có một cách đơn giản để đạt được điều này.

myButton.userInteractionEnabled = false

Điều này sẽ chỉ vô hiệu hóa bất kỳ cử chỉ chạm mà không thay đổi sự xuất hiện của nút


5

Trong Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

hoặc là

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

5

Đặt title colorcho các trạng thái khác nhau:

@IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 0.3), for: .disabled)
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 1), for: .normal)
        }
    }

Cách sử dụng: (màu văn bản sẽ tự động thay đổi)

loginButton.isEnabled = false

nhập mô tả hình ảnh ở đây


3

Tạo tiện ích mở rộng trong Swift> 3.0 thay vì mỗi nút

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}

3

Bạn có thể sử dụng cả hai câu trả lời đầu tiên và sẽ có kết quả tốt hơn.

Trong trình kiểm tra thuộc tính (khi bạn chọn nút), thay đổi Cấu hình trạng thái thành Vô hiệu hóa để đặt Hình ảnh mới sẽ xuất hiện khi bị tắt (xóa điểm đánh dấu trong Nội dung-> Đã bật kiểm tra để tắt) .

Và khi bạn thay đổi trạng thái thành bật, hình ảnh sẽ tải trạng thái từ trạng thái này.

Thêm logic alpha vào đây là một chi tiết tốt.


3

Swift 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            DispatchQueue.main.async {
                if self.isEnabled {
                    self.alpha = 1.0
                }
                else {
                    self.alpha = 0.6
                }
            }
        }
    }
}

Cách sử dụng

myButton.isEnabled = false

2

Tôi bị mắc kẹt trong cùng một vấn đề. Đặt alpha không phải là điều tôi muốn.

UIButtoncó " hình nền " và " màu nền ". Đối với hình ảnh, UIButtoncó một tài sản như

@property (nonatomic) BOOL adjustsImageWhenDisabled

Và hình nền được vẽ nhẹ hơn khi nút bị tắt. Đối với màu nền, cài đặt alpha, giải pháp của Ravin, hoạt động tốt.

Trước tiên, bạn phải kiểm tra xem bạn đã bỏ chọn hộp "vô hiệu hóa điều chỉnh hình ảnh" trong Tiện ích-Thuộc tính.
Sau đó, kiểm tra màu nền cho nút này.

(Hy vọng nó hữu ích. Đây là một bài viết cũ; mọi thứ có thể đã thay đổi trong Xcode).


1

Có vẻ như đoạn mã sau hoạt động tốt. Nhưng trong một số trường hợp, điều này không hoạt động.

sendButton.enabled = NO;
sendButton.alpha = 0.5;

Nếu đoạn mã trên không hoạt động, vui lòng bọc nó trong Main Thread. vì thế

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

nếu bạn đi với nhanh chóng, như thế này

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

Ngoài ra, nếu bạn tùy chỉnh UIButton, hãy thêm phần này vào lớp Nút.

override var isEnabled: Bool {
    didSet {
        DispatchQueue.main.async {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
        }
    }
}

Cảm ơn bạn và thích mã hóa !!!


1

Nếu UIButtontrong trạng thái kết hợp của selecteddisabled, trạng thái của nó là UIControlStateSelected | UIControlStateDisabled.

Vì vậy, trạng thái của nó cần phải được điều chỉnh như thế này:

[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];

Một cách tiếp cận là phân lớp UIButtonnhư sau:

@implementation TTButton
- (void)awakeFromNib {
   [super awakeFromNib];

    //! Fix behavior when `disabled && selected`
    //! Load settings in `xib` or `storyboard`, and apply it again.
    UIColor *color = [self titleColorForState:UIControlStateDisabled];
    [self setTitleColor:color forState:UIControlStateDisabled];

    UIImage *img = [self imageForState:UIControlStateDisabled];
    [self setImage:img forState:UIControlStateDisabled];
}

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
    [super setTitleColor:color forState:state];

    //
    if (UIControlStateDisabled == state) {
        [super setTitleColor:color forState:UIControlStateSelected | state];
        [super setTitleColor:color forState:UIControlStateHighlighted | state];
    }
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];

    if (UIControlStateDisabled == state) {
        [super setImage:image forState:UIControlStateSelected | state];
        [super setImage:image forState:UIControlStateHighlighted | state];
    }
}

@end

1
Đây phải là câu trả lời được chấp nhận. Trên Swift, bạn sẽ cần một cái gì đó như setTitleColor (bị vô hiệu hóa, cho: [.disables, .selected])
Paulo Cesar

0

Câu hỏi này có rất nhiều câu trả lời nhưng tất cả chúng có vẻ không hữu ích lắm trong trường hợp nếu bạn thực sự muốn sử dụng backgroundColor để tạo kiểu cho các nút của mình. UIButton có tùy chọn đẹp để đặt các hình ảnh khác nhau cho các trạng thái điều khiển khác nhau nhưng không có tính năng giống nhau cho màu nền. Vì vậy, một trong những giải pháp là thêm phần mở rộng sẽ tạo ra hình ảnh từ màu sắc và áp dụng chúng cho nút.

extension UIButton {
  private func image(withColor 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(image(withColor: color), for: state)
  }
}

Chỉ có một vấn đề với giải pháp này - thay đổi này sẽ không được áp dụng cho các nút được tạo trong bảng phân cảnh. Đối với tôi đó không phải là vấn đề vì tôi thích phong cách UI từ mã. Nếu bạn muốn sử dụng bảng phân cảnh thì một số phép thuật bổ sung với@IBInspectable .

Tùy chọn thứ hai là phân lớp nhưng tôi thích tránh điều này.


0

Có lẽ bạn có thể phân lớp nút của bạn và ghi đè biến isEnables của bạn. Ưu điểm là bạn có thể tái sử dụng ở nhiều nơi.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }

-1
#import "UIButton+My.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIButton (My)


-(void)fade :(BOOL)enable{
    self.enabled=enable;//
    self.alpha=enable?1.0:0.5;
}

@end

.h:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

2
Một số mô tả kèm theo mã của bạn sẽ làm cho câu trả lời tốt hơn.
Phantômaxx
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.