2011-09-25 3 views
21

이미지가있는 UIButton이 있고 비활성화 된 상태에서이 이미지의 알파가 3 개 있어야합니다.비활성화 상태에서 UIButton 이미지 알파를 어떻게 변경합니까?

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

어떻게하면됩니까?

업데이트 : : 기본적으로 UIButton은 사용 중지 된 상태의 이미지 알파 (.5?)를 줄입니다. 하지만이 값을 미세 조정하는 방법을 알고 싶습니다.

+0

결국나요? – bryanmac

+0

이 질문에 대한 해결책을 찾는데도 관심이 있습니다. – SAHM

+1

나는이 질문에 대한 대답이 여기에 추가되었다고 생각한다. http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –

답변

15

버튼이 비활성화 된 상태에서 알파를 설정해도 작동하지 않으면 비활성화 된 이미지를 원하는 알파 값으로 설정하십시오.

그냥 테스트, 상태에 관계없이 UIButton에 알파를 설정할 수 있으며 잘 작동합니다.

self.yourButton.alpha = 0.25; 
+0

문제는 준비된 이미지가 어떤보기가 될지 모르기 때문입니다. 그 뒤에 (알파의 요점은) – bryanmac

+0

나는 알파의 포인트입니다, PNG는 알파를 지원하므로 지금은 알파와 재고 이미지를 사용하여 문제가 뭐죠 동의합니까? 저는 항상 이것을 사용합니다. 실제로 사용하지 않는 유일한 시간은 런타임에 페이드 효과를 위해 알파를 동적으로 변경하려고 할 때입니다. – EricLeaf

+1

알파 PNG의 좋은 점.또한 [button setAlpha]의 경우, 나는 그것을 보았고 작동합니다. 유일한 문제는 여러분이나 다른 코드가 버튼의 상태를 간단히 설정할 수 없다는 것입니다. 항상 알파를 설정하고 상태 변경시 알파를 재설정해야한다는 것을 기억해야합니다. – bryanmac

7

당신은 UIImage의 두 인스턴스 활성화를위한 하나 장애인을위한 일을해야합니다.

힘든 부분은 장애가있는 부분이므로 UIImage에 알파를 설정할 수 없습니다. UIImageView에 설정해야하지만 버튼에 UIImageView이 없으면 UIImage이 필요합니다.

실제로 이것을 수행하려는 경우 알파가 설정된 UIImageView의 결과 이미지를 만든 후 비활성화 된 버튼 상태로 동일한 이미지를로드 할 수 있습니다.

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

알파로 제어되는 버튼 이미지를 얻으려면 많은 시간이 필요합니다. 더 쉬운 방법이 있을지 모르지만 그게 내가 찾을 수있는 전부입니다. 희망이 도움이됩니다.

+1

Thanks @bryanmac !! :) – Salmo

4

은 서브 클래 싱있는 UIButton이와 setEnabled: 방법을 연장 작동하는 것 같다 :

나는 그것을 철저하게 테스트하지 않은,하지만 화면이 회전하면 값 재설정을 찾았어요
- (void) setEnabled:(BOOL)enabled {  
    [super setEnabled:enabled]; 
    if (enabled) { 
     self.imageView.alpha = 1; 
    } else { 
     self.imageView.alpha = .25; 
    } 
} 

. setFrame: 메서드에 동일한 코드를 추가하면이 값이 변경되는 다른 상황이 있는지 확실하지 않습니다.

+1

가끔은 이것이 작동하지 않는 것을 발견했습니다. UIButton은 후드 아래에서 자체적 인 작업을 할 때'imageView'를 수정한다고 생각합니다 (기본값, 선택된 이미지 사이에서 변경 될 수 있습니다). 그리고 버튼이 두드려 짐에 따라'setEnabled'가 호출되면 알파 값이 지속되지 않을 수 있습니다 (예 :' UIButton이 선택된 상태/하이라이트 상태/디폴트 상태 사이의 외관을 동시에 수정하는 동안 "setEnabled"). –

+0

그런 다음 'layoutSubviews'를 재정의하고 필요할 때 '[self setNeedsLayout]'을 호출하십시오. – Cyrille

+0

'- (void) setEnabled : (BOOL) enabled { super.enabled = enabled; self.imageView.alpha = 사용 하시겠습니까? 1 : 0.5; self.titleLabel.alpha = self.imageView.alpha; }' –

13

크레딧은 @bryanmachelpful answer으로 이동합니다. 그의 코드를 시작점으로 사용했지만 UIImageView을 사용하지 않고도 같은 결과를 얻을 수 있음을 알았습니다.

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

이 비활성화 상태의 버튼의 배경 이미지를 설정합니다 : 여기

내 솔루션입니다

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

편집 : 난을 만들어 더 내 솔루션을 정제

카테고리에 UIImage이 있습니다. 방법 :

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

비활성화 상태의 버튼의 배경 이미지 설정 :

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

위대한 작품. 그러나 그것은 내 이미지의 @ 2x 버전을 사용하지 않았습니다. UIGraphicsBeginImageContextWithOptions (image.size, NO, 0.0)를 사용하는 경우; UIGraphicsBeginImageContext (image.size) 대신에 망막 이미지도 지원합니다. –

+0

@JonHobson 팁 주셔서 감사! –

+0

이것은 훌륭한 대답입니다! 나는 지금 내 응용 프로그램에서 이것을 사용하고 있습니다. @StephSharp에게 감사합니다! –

1

나는 이러한 솔루션 중 어느 것도 정말 작동하지 것을 발견했다. 그 일의 가장 깨끗한 방법은 하위 클래스이며, 대신 self.imageView를 사용, 그냥이 같은 자신 만의 이미지 뷰를 추가

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

는 다음과 같이 사용자 정의 알파를 추가

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

답변의 개념이 정확합니다. – enadun

2

버튼의 이미지보기. (읽기 전용)

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

이 속성은 읽기 전용이지만 해당 속성은 읽기/쓰기입니다.

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

사용 : [btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false; 사람이 그것을 필요로하는 경우에

+0

이것은 코드 덤프로 아무 것도 언급하지 않으려 고합니다. 이 문제를 개선하십시오. – Drew

3

, 여기 스위프트의 대답 :

서브 클래스있는 UIButton이와 재정의

class MyCustomButton: UIButton { 

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

가 원하는 버튼의 클래스를 설정 가능 이 속성을 "MyCustomButton"(또는 이름을 지정하기 위해 선택한 이름)으로 지정하려면

@IBOutlet weak var nextButton: MyCustomButton! 
0

스위프트 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 
    } 
} 

사용법 : 당신은 이것에 대한 해결책을 찾기

button.setImage(image.copy(alpha: 0.3), for: .disabled) 
관련 문제