web-dev-qa-db-ja.com

無効状態でUIButton画像のアルファをどのように変更しますか?

画像付きのUIButtonがあり、無効な状態では、この画像のアルファは.3になります。

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

どうすればこれを達成できますか?

[〜#〜] update [〜#〜]:気づいたのですが、デフォルトでは、UIButtonは無効状態(おそらく.5?)で画像のアルファを減らします。しかし、私はこの値を微調整する方法を知りたいのです。

25
pixelfreak

ボタンが無効になっているときにアルファを設定しても機能しない場合は、無効にした画像を希望のアルファ値に設定してください。

これをテストしただけで、状態に関係なく、UIButtonにアルファを設定でき、問題なく機能します。

self.yourButton.alpha = 0.25;
17
EricLeaf

参考回答 のクレジットは@ bryanmacに送られます。私は彼のコードを出発点として使用しましたが、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];
15
Steph Sharp

UIImageの2つのインスタンスが必要です。1つは有効、もう1つは無効です。

難しいのは障害者向けで、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];

これは、アルファ制御されたボタン画像を取得するのに多くのことを行います。もっと簡単な方法があるかもしれませんが、それが私が見つけたすべてです。お役に立てば幸いです。

7
bryanmac

UIButtonをサブクラス化し、setEnabled:メソッドを拡張すると機能するようです。

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

私はそれを徹底的にテストしていませんが、画面を回転させると値がリセットされることがわかりました。同じコードをsetFrame:メソッドに追加すると修正されますが、この値が変更される状況が他にあるかどうかはわかりません。

5
Anthony Mattox

誰かがそれを必要とする場合のために、ここにSwiftの答えがあります:

UIButtonをサブクラス化してオーバーライドを有効化

class MyCustomButton: UIButton {

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

このプロパティを設定するボタンのクラスを "MyCustomButton"(または名前を付けるために選択したもの)に設定します

 @IBOutlet weak var nextButton: MyCustomButton!
4
Kay

Swift

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)
3
sash

ボタンの画像ビュー。 (読み取り専用)

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

このプロパティは読み取り専用ですが、独自のプロパティは読み取り/書き込み可能です。

2
dahe

これらのソリューションはどれも実際には機能しないことがわかりました。これを行う最もクリーンな方法は、サブクラス化することであり、self.imageViewを使用する代わりに、次のように独自のカスタムimageViewを追加するだけです。

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

次に、次のようにカスタムアルファを追加します。

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

A Swift 4バージョンのSteph Sharpの回答:

extension UIImage {

    func translucentImageWithAlpha(alpha: CGFloat) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0)
        let bounds = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
        self.draw(in: bounds, blendMode: .screen, alpha: alpha)

        let translucentImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return translucentImage!
    }
}

次のように使用できます:

if let image = self.image(for: .normal) {
    self.setImage(image.translucentImageWithAlpha(alpha: 0.3), for: .disabled)
}
0
Pochi
- (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
Raul Quispe