UIButton:選択されたハイライト状態の画像を設定します


158

ボタンの状態を[標準]、[強調表示]、[選択済み]に画像を設定しましたが、選択状態のボタンを押して強調表示すると、強調表示された画像が表示されず、灰色の画像しか表示されません。ボタンが選択されたときに画像を強調表示状態に設定できますか?

私のコード:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

私がする時:

[button setSelected:YES];

ボタンを押すと、「pressed.png」画像が選択されません。


+1私も同じ問題を抱えています。答えがあることを願っています。
Nick Weaver

3
鮮やかさ!あなたが組み合わせのために画像を設定できることを誰が知っているでしょう!私の魅力のように働いた!
デビッドH

1
驚くばかり!!!あなたの質問自体が私にとっての答えです...うまくいきました!!!
キランS

1
UIControlStateHighlightedだけで機能しますが、button.adjustsImageWhenHighlighted = NO;最初に呼び出します。
Graham Perks 2013

この。以前のソリューションよりもはるかに優れています。
Meshach 2013年

回答:


231

私は解決策を見つけました:追加行を追加する必要があります

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

5
インターフェイスビルダーを介してこれを行う方法はありますか?
Stephen

6
@stephen:「StateConfig」(Default / Highlighted / Selected / Disabled)プロパティのさまざまな条件に対するUIButtonの「Background」(画像)プロパティの設定は私にとってはうまくいきます。
Ajeet

2
Ajeetの解決策は私にはうまくいきませんでした。私はまた、IBでそれを行う方法を知りたい
Lucas

3
これをIBで設定することはできないので、viewDidLoadメソッドに配置できます。IBでイメージを変更でき、常に一致するようにコードを更新する必要がないため、ほぼ同じです。[button setImage:[button imageForState:UIControlStateHighlighted] forState:UIControlStateSelected | UIControlStateHighlighted];
Dave Wood

4
あなたはIBでこれを行うことができます。以下の回答のスクリーンショットをご覧ください!
Ríomhaire

121

これはInterface Builderで行うことができます。

UIButton設定するを選択して、IBに移動しますattributes inspector

スクリーンショットでは、カスタムボタンタイプを使用していますが、それは問題ではありませ

カスタムデフォルト

ここに画像の説明を入力してください

ここに画像の説明を入力してください


5
カスタムまたはシステムは実際には非常に重要です。両方をいじってみてください。
Ben Sinclair 2014年

9
質問の文脈ではありません。
Ríomhaire

7
これは質問の答えにはなりません。ハイライトされた状態と選択された状態の組み合わせ
ラファエルノブレ

+1これらのプルダウンメニューを完全に見落としたため(最近までプログラムですべてを行っていました...)
Nicolas Miari

30

スウィフト3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

使用できる背景画像を設定するには setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])

アレイバージョンは私にはうまくいきませんでした。(少なくともの間setImage
ハギー

1
iOS 10は、通常の画像や選択された画像を暗くします。選択した強調表示された画像を設定しても、後者は自動的に暗くなりません。これは残念です。
snakeoil 16

28

ここのほとんどのポスターは完全にポイントを逃していると思う。私も同じ問題を抱えていました。元の質問は、IBで設定できない選択されたボタン(両方の状態を組み合わせる)の強調表示された状態に関するものでした。言及された1つの投稿としてのみ機能するソリューション:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

私は知っているが、私はどういうわけか許可されなかった
alghanor 2013

1
上記のように設定しても、何らかの理由で問題が発生します。コントロール状態のカスタムイメージを取得する唯一の方法は、UIControlStateHighlightedのみを設定することです。
Julius

12

それを行う正当な理由がある場合、これはトリックを行います

これらのターゲットを追加します。

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}

これはありがとうございましたが、実際には複雑すぎます)ボタンが上記のように機能することを期待します
user478681

7

Swift 3.xでは、次の方法でボタンが選択されたときにハイライト画像を設定できます。

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))


2

私が間違っていたら訂正してください。することによって

   [button setSelected:YES];

選択したボタンの状態を明確に変更しています。当然のことながら、提供したコードによって、画像は選択された状態の場合のイメージになりますchecked.png


「状態の変更をクリアする...」の意味を完全に理解していない。これは非常に簡単です。上記の状態の画像を設定し、このボタンにtarget-actionを追加し、アクションを処理するメソッド(コントロールイベントUIControlEventTouchUpInside)でボタンの選択状態を切り替えます[ボタンsetSelected:YES / NO]。そして、ボタンが現在選択された状態にあり、それを押したりハイライトしたりすると、この状態の画像設定がないように、灰色の画像のみが表示されます。
user478681

私はそこに明確に意味しました。そのために残念。最初にボタンを押すと、その状態が選択された状態になり、画像が表示されます。したがって、強調表示された画像のみを取得したい場合は、その状態を強調表示された状態にします。私はあなたを正しく取得しているかどうかは
わかり

最初にボタンを押すと、強調表示された状態になり、次にボタンを離すと、状態が選択されます(アクションメソッドで設定したとおり)。もう一度(ボタンが選択された状態になっている)もう一度押すと、状態が強調表示に変わり、pressed.png画像が表示されますが、この場合は表示されません。
user478681

1

誰かがこれがSwiftでどのように機能するのか疑問に思っているなら、ここに私の解決策があります:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)

@basegodこれは実用的な解決策ですが、Roland Keesomがそれを書いた方法ははるかにきれいです。
jungledev 2016

1

Swift 3以上

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

または

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

これは、ボタンが現在のselected状態になっていることを意味し、それをタッチすると、highlight状態が表示されます。


0

設定に問題がありましたimageView.highlighted = NO;YESの設定は適切に機能し、画像は強調表示されたものに変更されました)。

解決策は [imageView setHighlighted:NO];

すべてが適切に機能しました。


0

どこから電話をかけたいか

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

メソッド:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

上記のJorgeの功績ですが、完全に機能するソリューションを提供するために少し改善しました


0

Xamarin C#

ビット単位のORを実行すると、何らかの理由で機能しません

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

以下の作品

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);

0

選択された状態のカスタムボタンをタップアンドホールドしたときにOSがデフォルトで提供する強調表示された色合いも必要な場合は、このUIButtonサブクラスを使用します。Swift 5で書かれています:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.