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

「レコード」BarButtonItemをタップした後、録音が終了するまでプログラムで強調表示しておきたいと思います。 iOSのハイライトグラフィックは非常に優れているため、その状態を維持または設定したいと考えています。

これまでは 'setSelected'と 'setHighlighted'が見つかりましたが、これらはUIBarButtonItemでは機能しません。 これを解決する方法に関する提案はありますか?事前にありがとう、コーエン。

17

9 答え

9
追加された
こんにちはMichael、UIBarButtonItemでcustomViewを使用するサンプルコードがありますか?私はそれを実装しようとしましたが、透明にしたい黒い四角で終わりました。助言がありますか?
追加された 著者 Ckoeny,
私はUIImageViewをcustomViewとして使用してこの問題を解決しました。 userInteractionEnabledをTRUEに設定します。
追加された 著者 Ckoeny,

UIBarButtonItem UIButton を追加して追加すると、CustomViewを尋ねることができます。

UIBarButtonItem with a backing UIButton

UIButton *button = (UIButton *)[self.barButtonItem customView];
[button setSelected:YES];
5
追加された
この回答は素晴らしいですが、唯一の問題は[self.barButtonItem customView]をキャストする必要があることです。 UIButtonに渡します。 (UIButton *)self.barButtonItem.customView;そうでなければ素晴らしい作品です。
追加された 著者 Bill Burgess,
私はそれを上回った。 downvoteがどこから来たかわからない。
追加された 著者 Bill Burgess,
はい、キャストは必要ですが、大したことはありません。あなたはこの答えに投票しましたか?ちょうどそれを編集する。
追加された 著者 Cameron Lowell Palmer,
有難う御座います!
追加された 著者 Cameron Lowell Palmer,

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

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
追加された

たとえば、 btnMoreOut のように、このボタンのコンセントを作成します。

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

私はこれが助けてくれることを願っています。

4
追加された
ブリリアント。私の実装のために完全に動作します! :)
追加された 著者 Rameez Hussain,
これは宝石のように機能します!
追加された 著者 Miki,

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

2)スタイルプロパティを使用して、それをUIBarButtonItemStyleDoneまたはUIBarButtonItemStylePlainにいくつかの状態に基づいて割り当てます。

NB。あなたは様々な方法で状態を得ることができます。たとえば、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
追加された
私は人々に説明を追加することに疲れており、「リンクのみ」オプションがある間は「コードのみ」オプションはありません。説明を追加してください!
追加された 著者 Mark,
ありがとう@ココナッツ、これははるかに良いです。
追加された 著者 Mark,
@マーク、それはあなたのための十分なコンテキストは、私に教えてください。今それは意味があるのですか?私はあなたを投げているかもしれない三項演算子を使用しています。
追加された 著者 smileBot,

1つの状態 "UIControlStateNormal"のようにボタンの2つの状態に対して2つのイメージを使用することができます。通常の状態でイメージを使用できます。

そして、ボタンが押されたときに、それが押されたことを示す他の画像を設定し、次にUIButtonのisSelectedメソッドを使って画像をチェックします。

これがあなたにいくらか理解されることを願っています。

2
追加された
-1は、isSelectedメソッドがUIButtonで利用可能であることを確認しますが、特にUIBarButtonItemの同等メソッドを要求します。
追加された 著者 martin jakubik,

p.a.'s answer, converted for Xcode 9, Swift 4.
The idea is that the .done style highlights - or bolds, in Swift 4 - the button text.

強調表示されていない状態でボタン項目を初期化する:

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)

Notes:

  • The bordered style was deprecated in iOS 8, so I used .plain here instead. They both present the button item's text in an unhighlighted state.
  • The #selector function must either be an @IBAction, or it must be prefixed with @objc, to avoid "Objective-C inference" issues. For example:

    @objc func doSomething() { ... }
    

    or, if you've connected an action to the button item:

    @IBAction func doSomething() { ... }
    

    Both of these function declarations tell the compiler that they're using Objective-C-based functionality. This is required because #selector is anobjective-cthing under the hood, and in Swift 4 you have to state this, rather than letting the compiler infer what's going on as it has done previously.

0
追加された

あなたはこれを試すことができます(スウィフト):

    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
追加された

If you wanna change just title attributes (for example, title color), you can call setTitleTextAttributes:forState:

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

0
追加された