2011-09-25 28 views
21

Tôi có UIButton với hình ảnh và trạng thái bị tắt, hình ảnh này phải có .3 alpha.Làm thế nào để bạn thay đổi hình ảnh UIButton alpha trên trạng thái vô hiệu hóa?

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *arrowImage = [UIImage imageNamed:@"arrow.png"]; 
[button setImage:arrowImage forState:UIControlStateNormal]; 

// The arrow should be half transparent here 
[button setImage:arrowImage forState:UIControlStateDisabled]; 

Làm cách nào để thực hiện việc này?

CẬP NHẬT: Tôi nhận thấy, theo mặc định UIButton không làm giảm alpha của hình ảnh trên trạng thái bị vô hiệu hóa (có thể ở .5?). Nhưng tôi muốn biết cách tinh chỉnh giá trị này.

+0

Cậu kết thúc tìm một giải pháp cho việc này? – bryanmac

+0

Tôi cũng muốn tìm giải pháp cho câu hỏi này. – SAHM

+1

Tôi nghĩ câu trả lời cho câu hỏi này đã được thêm vào đây. http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –

Trả lời

15

Nếu đặt alpha trong khi nút bị vô hiệu hóa không hoạt động, sau đó chỉ cần tạo hình ảnh bị vô hiệu hóa theo giá trị alpha bạn muốn.

Chỉ cần thử nghiệm điều này, bạn có thể đặt alpha trên UIButton, bất kể trạng thái và nó hoạt động tốt.

self.yourButton.alpha = 0.25; 
+0

Vấn đề là hình ảnh đã chuẩn bị không biết chế độ xem sẽ là gì đằng sau nó (đó là điểm alpha) – bryanmac

+0

Tôi đồng ý rằng đó là điểm alpha, PNG hỗ trợ alpha, vì vậy bây giờ vấn đề với việc sử dụng một hình ảnh chứng khoán với alpha là gì? Tôi làm điều này tất cả các thời gian, trong thực tế, thời gian duy nhất tôi không sử dụng nó là khi tôi muốn tự động thay đổi alpha cho một hiệu ứng mờ dần trong thời gian chạy. – EricLeaf

+1

Điểm tốt trên alpha PNG.Ngoài ra, đối với [button setAlpha], tôi thấy điều đó và nó hoạt động, vấn đề duy nhất là bạn hoặc mã khác không thể đặt trạng thái của nút - bạn luôn phải nhớ đặt alpha và đặt lại alpha về thay đổi trạng thái. – bryanmac

7

Bạn cần hai phiên bản UIImage, một để kích hoạt và một cho người khuyết tật.

Phần khó khăn dành cho người khuyết tật, bạn không thể đặt alpha trên UIImage. Bạn cần đặt số này trên UIImageView nhưng nút không mất UIImageView, phải mất UIImage.

Nếu bạn thực sự muốn thực hiện việc này, bạn có thể tải cùng một hình ảnh vào trạng thái nút bị vô hiệu hóa sau khi tạo hình ảnh kết quả từ UIImageView có tập hợp alpha trên đó.

UIImageView *uiv = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png"]; 

// get resultant UIImage from UIImageView 
UIGraphicsBeginImageContext(uiv.image.size); 
CGRect rect = CGRectMake(0, 0, uiv.image.size.width, uiv.image.size.height); 
[uiv.image drawInRect:rect blendMode:kCGBlendModeScreen alpha:0.2]; 

UIImage *disabledArrow = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[button setImage:disabledArrow forState:UIControlStateDisabled]; 

Có rất nhiều thứ để trải qua để có được hình ảnh nút được điều khiển bằng alpha. Có thể có một cách dễ dàng hơn nhưng đó là tất cả những gì tôi có thể tìm thấy. Hy vọng rằng sẽ giúp.

+1

Cảm ơn @bryanmac !! :) – Salmo

4

subclassing UIButton và mở rộng các phương pháp setEnabled: dường như làm việc:

- (void) setEnabled:(BOOL)enabled {  
    [super setEnabled:enabled]; 
    if (enabled) { 
     self.imageView.alpha = 1; 
    } else { 
     self.imageView.alpha = .25; 
    } 
} 

tôi đã không kiểm tra nó kỹ lưỡng, nhưng đã tìm ra resets giá trị nếu màn hình được xoay. Thêm cùng một mã vào phương pháp setFrame: sửa lỗi đó, nhưng tôi không chắc liệu có những tình huống khác mà giá trị này được thay đổi hay không.

+1

Tôi đã tìm thấy rằng đôi khi điều này không hoạt động. Tôi nghĩ rằng UIButton sửa đổi 'imageView' khi thực hiện các công cụ riêng của nó dưới mui xe (có thể thay đổi giữa các ảnh mặc định, được chọn?) Và giá trị alpha có thể không tồn tại nếu' setEnabled' được gọi là nút được khai thác (ví dụ, gọi ' setEnabled' trong khi UIButton đồng thời sửa đổi giao diện của nó giữa trạng thái đã chọn/được đánh dấu/mặc định). –

+0

Sau đó ghi đè 'layoutSubviews' và gọi '[self setNeedsLayout]' khi cần. – Cyrille

+0

'- (void) setEnabled: (BOOL) bật { super.enabled = enabled; self.imageView.alpha = enabled? 1: 0,5; self.titleLabel.alpha = self.imageView.alpha; } ' –

13

Tín dụng chuyển đến @bryanmac cho số helpful answer của mình. Tôi đã sử dụng mã của mình như là một điểm khởi đầu, nhưng tìm thấy cùng một thứ có thể đạt được mà không cần sử dụng một số UIImageView.

Đây là giải pháp của tôi:

- (UIImage *)translucentImageFromImage:(UIImage *)image withAlpha:(CGFloat)alpha 
{ 
    CGRect rect = CGRectZero; 
    rect.size = image.size; 

    UIGraphicsBeginImageContext(image.size); 
    [image drawInRect:rect blendMode:kCGBlendModeScreen alpha:alpha]; 
    UIImage * translucentImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return translucentImage; 
} 

Đặt hình nền của nút cho người khuyết tật nhà nước:

UIImage * disabledBgImage = [self translucentImageFromImage:originalBgImage withAlpha:0.5f]; 
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled]; 

EDIT:

tôi tinh chế giải pháp của tôi hơn nữa bằng cách tạo ra một loại trên UIImage với điều này Phương pháp:

- (UIImage *)translucentImageWithAlpha:(CGFloat)alpha 
{ 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); 
    CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height); 
    [self drawInRect:bounds blendMode:kCGBlendModeScreen alpha:alpha]; 

    UIImage * translucentImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return translucentImage; 
} 

Đặt hình nền của nút cho tình trạng khuyết tật:

UIImage * disabledBgImage = [originalBgImage translucentImageWithAlpha:0.5f]; 
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled]; 
+4

Điều này hiệu quả. Tuy nhiên nó không sử dụng phiên bản @ 2x của hình ảnh của tôi. Nếu bạn sử dụng UIGraphicsBeginImageContextWithOptions (image.size, NO, 0.0); thay vì UIGraphicsBeginImageContext (image.size), nó cũng hỗ trợ hình ảnh võng mạc. –

+0

@JonHobson Cảm ơn lời khuyên! –

+0

Đây là một câu trả lời tuyệt vời! Tôi hiện đang sử dụng tính năng này trong ứng dụng của mình. Cảm ơn @StephSharp! –

1

tôi thấy rằng không ai trong số các giải pháp này thực sự làm việc. Cách rõ ràng nhất để làm việc đó là để phân lớp, và thay vì sử dụng self.imageView, chỉ cần thêm IMAGExem riêng của bạn như thế này:

_customImageView = [[UIImageview alloc] initWithImage:image]; 

Sau đó thêm alpha tùy chỉnh của bạn như vậy:

- (void)setEnabled:(BOOL)enabled { 
    [super setEnabled:enabled]; 
    if (enabled) { 
     _customImageView.alpha = 1.0f; 
    } else { 
     _customImageView.alpha = 0.25f; 
    } 
} 
+0

Khái niệm câu trả lời của bạn là chính xác. – enadun

2

Các chế độ xem hình ảnh của nút. (chỉ đọc)

@property(nonatomic, readonly, retain) UIImageView *imageView 

Mặc dù thuộc tính này là chỉ đọc, thuộc tính riêng của nó là đọc/ghi.

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

Sử dụng: [btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false;

+0

Đây là một bãi chứa mã không có nỗ lực hữu ích để bình luận về bất cứ điều gì. Hãy cải thiện điều này. – Drew

3

Trong trường hợp bất cứ ai cần nó, đây là một câu trả lời trong Swift:

Subclass UIButton và ghi đè kích hoạt

class MyCustomButton: UIButton { 

override var enabled: Bool { 
    didSet{ 
     alpha = enabled ? 1.0 : 0.3 
    } 
} 

Đặt lớp của bất kỳ nút bạn muốn để có thuộc tính này cho "MyCustomButton" (hoặc bất kỳ thứ gì bạn chọn đặt tên cho nó)

@IBOutlet weak var nextButton: MyCustomButton! 
0

Swift 3:

extension UIImage { 
    func copy(alpha: CGFloat) -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     draw(at: CGPoint.zero, blendMode: .normal, alpha: alpha) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
} 

Cách sử dụng:

button.setImage(image.copy(alpha: 0.3), for: .disabled) 
Các vấn đề liên quan