web-dev-qa-db-ja.com

プログラムでUIBarButtonItemを強調表示します

'record' BarButtonItemをタップした後、記録が終了するまでプログラムで強調表示したままにしておきます。 iOSのハイライトグラフィックはとても良いので、そのままにするか、その状態を設定したいと思います。

これまで、「setSelected」と「setHighlighted」が見つかりましたが、これらはUIBarButtonItemでは機能しません。これを解決する方法について何か提案はありますか?よろしくお願いします。

17
Ckoeny

setSelectedsetHighlightedはUIControlsで正常に機能しますが、UIBarButtonItems(UIControlsではありません)では機能しません。

UIBarButtonItemの - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics (ドキュメントにリンクされている)メソッドを使用して、背景画像を強調表示を模倣したものに変更することをお勧めします。

強調表示を模倣するカスタムUIViewをアイテムに設定することもできます( customView プロパティを参照)。

9

UIBarButtonItemを裏打ちするUIButtonを追加する場合は、CustomViewを要求するだけです。

UIBarButtonItem with a backing UIButton

UIButton *button = (UIButton *)[self.barButtonItem customView];
[button setSelected:YES];

どうしてもデフォルトのグラフィックを使用したい場合は、ボタンアイテムを次のように初期化できます。

UIBarButtonItem *toggleButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyButton" 
                                                                     style:UIBarButtonItemStyleBordered 
                                                                    target:someObject 
                                                                    action:@selector(doSomething:)];

で切り替えます

toggleButtonItem.style = (toggleButtonItem.style == UIBarButtonItemStyleBordered) 
                         ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered;

また、現在の状態を読み取るには、styleプロパティを使用する必要があります。

BOOL isSelected = (toggleButtonItem.style == UIBarButtonItemStyleDone)
5
Patrick

たとえば、btnMoreOutのように、このボタンのアウトレットを作成します。

btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1];

これがお役に立てば幸いです。頑張ってください:)

4
ThePunisher

1)バーボタンへの参照を取得します。

2)styleプロパティを使用して、何らかの状態に基づいてUIBarButtonItemStyleDoneまたはUIBarButtonItemStylePlainに割り当てます。

注意。さまざまな方法で状態を取得できます。たとえば、NSUserDefaultsを使用して、そこにキーと値のペアを保存します。値を引き出し、テストするBOOL表現を取得します。次に、次の行を記述します。

 self.myButton.style = self.someState ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain;

または、デフォルトではすべて次のようにネストされています。

self.myButton.style = [[NSUserDefaults standardUserDefaults] 
boolForKey:@"someKey"] ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain;

三項演算子なし:

if ([[NSUserDefaults standardUserDefaults] 
    boolForKey:@"someKey"]) {
self.myButton.style = UIBarButtonItemStyleDone; 
} else {
self.myButton.style = UIBarButtonItemStylePlain;
}
2
smileBot

p.a。の回答 、Xcode 9に変換、Swift 4。
アイデアは、.doneスタイルがSwift)で-または太字を強調表示することです4-ボタンのテキスト。

ハイライトされていない状態でボタンアイテムを初期化します。

let toggleButtonItem = UIBarButtonItem(title: "MyButton",
                                       style: .plain,
                                       target: self,
                                       action: #selector(doSomething))

次のように、三項演算子を使用して、ボタン項目を強調表示された状態に切り替えます。

toggleButtonItem.style = (toggleButtonItem.style == .plain) ?
                         toggleButtonItem.style = .done : toggleButtonItem.style = .plain

または、代わりに次のような通常のif/elseステートメントでハイライト状態を切り替えます。

if toggleButtonItem.style == .plain {
    toggleButtonItem.style = .done
}
else {
    toggleButtonItem.style = .plain
}

また、ボタン項目が強調表示されているかどうかを確認するブール値を設定するには、次のようにします。

var isHighlighted: Bool = (toggleButtonItem.style == .done)

注:

  • borderedスタイルはiOS8で非推奨になったため、代わりにここで.plainを使用しました。どちらも、ボタンアイテムのテキストを強調表示されていない状態で表示します。
  • 「Objective-C推論」の問題を回避するには、#selector関数を@IBActionにするか、接頭辞@objcを付ける必要があります。例えば:

    @objc func doSomething() { ... }
    

    または、アクションをボタンアイテムに接続した場合:

    @IBAction func doSomething() { ... }
    

    これらの関数宣言は両方とも、Objective-Cベースの機能を使用していることをコンパイラーに通知します。 #selectorは内部でObjective-Cのものであり、Swift 4では、コンパイラに任せるのではなく、これを述べる必要があるため、これが必要です。以前と同じように何が起こっているかを推測します。

1
leanne

タイトル属性(タイトルの色など)だけを変更したい場合は、setTitleTextAttributes:forState:を呼び出すことができます。

私にとっては、setTintColor:よりも安定して動作します(セグエのプッシュアニメーションをほどくときに色合いの色が変わる)。

0
Akhrameev

あなたはこれを試すことができます(Swift):

    func setupInterface(){

    var myButton = UIBarButtonItem()
    if (your_condition){
      myButton = UIBarButtonItem(image: UIImage(named: "img_selected"), style: .Plain, target: self, action: Selector("DoSomething:"))
    }
    else{
        myButton = UIBarButtonItem(image: UIImage(named: "img_unselected"), style: .Plain, target: self, action: Selector("DoSomething:"))
    }
    navigationItem.rightBarButtonItem = myButton
  }

ViewDidLoadでsetupInterface()を呼び出し、コードで別の関数を呼び出します。

0
Allan Scofield