画像付きの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?)で画像のアルファを減らします。しかし、私はこの値を微調整する方法を知りたいのです。
ボタンが無効になっているときにアルファを設定しても機能しない場合は、無効にした画像を希望のアルファ値に設定してください。
これをテストしただけで、状態に関係なく、UIButtonにアルファを設定でき、問題なく機能します。
self.yourButton.alpha = 0.25;
参考回答 のクレジットは@ 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];
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];
これは、アルファ制御されたボタン画像を取得するのに多くのことを行います。もっと簡単な方法があるかもしれませんが、それが私が見つけたすべてです。お役に立てば幸いです。
UIButtonをサブクラス化し、setEnabled:
メソッドを拡張すると機能するようです。
- (void) setEnabled:(BOOL)enabled {
[super setEnabled:enabled];
if (enabled) {
self.imageView.alpha = 1;
} else {
self.imageView.alpha = .25;
}
}
私はそれを徹底的にテストしていませんが、画面を回転させると値がリセットされることがわかりました。同じコードをsetFrame:
メソッドに追加すると修正されますが、この値が変更される状況が他にあるかどうかはわかりません。
誰かがそれを必要とする場合のために、ここにSwiftの答えがあります:
UIButtonをサブクラス化してオーバーライドを有効化
class MyCustomButton: UIButton {
override var enabled: Bool {
didSet{
alpha = enabled ? 1.0 : 0.3
}
}
このプロパティを設定するボタンのクラスを "MyCustomButton"(または名前を付けるために選択したもの)に設定します
@IBOutlet weak var nextButton: MyCustomButton!
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)
ボタンの画像ビュー。 (読み取り専用)
@property(nonatomic, readonly, retain) UIImageView *imageView
このプロパティは読み取り専用ですが、独自のプロパティは読み取り/書き込み可能です。
これらのソリューションはどれも実際には機能しないことがわかりました。これを行う最もクリーンな方法は、サブクラス化することであり、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;
}
}
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)
}
- (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;