'record' BarButtonItemをタップした後、記録が終了するまでプログラムで強調表示したままにしておきます。 iOSのハイライトグラフィックはとても良いので、そのままにするか、その状態を設定したいと思います。
これまで、「setSelected」と「setHighlighted」が見つかりましたが、これらはUIBarButtonItemでは機能しません。これを解決する方法について何か提案はありますか?よろしくお願いします。
setSelected
とsetHighlighted
はUIControlsで正常に機能しますが、UIBarButtonItems(UIControlsではありません)では機能しません。
UIBarButtonItemの - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
(ドキュメントにリンクされている)メソッドを使用して、背景画像を強調表示を模倣したものに変更することをお勧めします。
強調表示を模倣するカスタムUIViewをアイテムに設定することもできます( customView
プロパティを参照)。
UIBarButtonItem
を裏打ちするUIButton
を追加する場合は、CustomViewを要求するだけです。
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)
たとえば、btnMoreOut
のように、このボタンのアウトレットを作成します。
btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1];
これがお役に立てば幸いです。頑張ってください:)
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;
}
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では、コンパイラに任せるのではなく、これを述べる必要があるため、これが必要です。以前と同じように何が起こっているかを推測します。
タイトル属性(タイトルの色など)だけを変更したい場合は、setTitleTextAttributes:forState:
を呼び出すことができます。
私にとっては、setTintColor:
よりも安定して動作します(セグエのプッシュアニメーションをほどくときに色合いの色が変わる)。
あなたはこれを試すことができます(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()を呼び出し、コードで別の関数を呼び出します。