質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

933閲覧

NavigationBarにあるUIBarButtonItemの色を一部だけ変更したい

msa_winnie

総合スコア17

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/04/22 02:08

内容

NavigationBarにUIBarButtonItemを設定しています。
ナビゲーションバーにある、1つのボタンの色だけをアクションのタイミングで変更する方法はありますでしょうか。
具体的には、下の画像でいうと③ボタンを押した時に、③ボタンの色だけ変更し、
さらにもう一度③ボタンを押すと元の色に戻るといったことをしたいです。

イメージ説明
イメージ説明

ナビゲーションバーにある全アイテムの色を変更する方法はわかるのですが、1つのボタンだけ変更する方法が見つかりませんでした。
self.navigationController?.navigationBar.tintColor = UIColor.red

良いやり方をご存じの方がいらっしゃいましたら、ご教示のほどお願い申し上げます。

コード

// ボタン①
let ① : UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 22, height: 22))
①.setImage(UIImage(named: "image_①")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), for: .normal)
①.addTarget(vc, action: #selector(ViewController.btnNaviTapped①(sender:)), for: .touchUpInside)
btnNavi① = UIBarButtonItem(customView: ①)

// ボタン②
let ② : UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 22, height: 22))
②.setImage(UIImage(named: "image_②")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), for: .normal)
②.addTarget(vc, action: #selector(ViewController.btnNaviTapped②(sender:)), for: .touchUpInside)
btnNavi② = UIBarButtonItem(customView: ②)

// ボタン③
let ③ : UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 22, height: 22))
③.setImage(UIImage(named: "image_③")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), for: .normal)
③.addTarget(vc, action: #selector(ViewController.btnNaviTapped③(sender:)), for: .touchUpInside)
btnNavi③ = UIBarButtonItem(customView: ③)

// ボタンをナビゲーションバーにセット
navigationItem.rightBarButtonItems = [ btnNavi③ , btnNavi②]
navigationItem.leftBarButtonItems = [btnNavi①]

// アイテム色を変更
self.navigationController?.navigationBar.tintColor = UIColor.white
// バーの色を変更
self.navigationController?.navigationBar.barTintColor = NavigationbarColor

補足情報

Xcode:Version 10.2
Swift5
iOS12.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/04/22 02:11

UIBarButtonItemかUIButtonのtintColorを変えたらどうなります?
fuzzball

2019/04/22 02:15

あと、質問とは直接関係ないですが、UIBarButtonItemだけでも出来そうな気がするのですが、なぜUIButtonを使っているのでしょうか?
msa_winnie

2019/04/22 02:50

fuzzball様、教えていただきありがとうございます。 >UIBarButtonItemかUIButtonのtintColorを変えたらどうなります? UIBarButtonItemのtintColorを変更しても色が変わりませんでした。 UIButtonはUIBarButtonItemを設定する関数内でのみ持っているので、アクションの時に変更はできません。 >UIBarButtonItemだけでも出来そうな気がするのですが、なぜUIButtonを使っているのでしょうか? UIButtonを使っている理由は、以下の記事を参考にしたためです。 http://blog.suprsonicjetboy.com/entry/2017/06/09/172259 試しに、UIBarButtonItem設定の方法をUIButtonを使わない方法にしてみました。 // ボタン① btnNavi① = UIBarButtonItem( image: UIImage(named: "image_①")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped①(sender:))) // ボタン② btnNavi② = UIBarButtonItem( image: UIImage(named: "image_②")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped②(sender:))) // ボタン③ btnNavi③ = UIBarButtonItem( image: UIImage(named: "image_③")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped③(sender:))) そして、アクションが発生したタイミングで btnNavi③.tintColor = UIColor.red としたところ、無事にボタン③の色だけ、赤に変わりました。 今後は、余計な処理がされていないか見返すようにしたいと思います。 教えていただきありがとうございました。
guest

回答1

0

自己解決

fuzzball様に教えていただき、解決に至りました。
ありがとうございました。


UIButtonを使った場合では、btnNavi③.tintColor = UIColor.redとしてもボタンの色が変更されませんでした。
UIButtonを使わず、以下のようにUIBarButtonItemだけを使うように変更しました。

// ボタン①
btnNavi① = UIBarButtonItem( image: UIImage(named: "image_①")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped①(sender:)))

// ボタン②
btnNavi② = UIBarButtonItem( image: UIImage(named: "image_②")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped②(sender:)))

// ボタン③
btnNavi③ = UIBarButtonItem( image: UIImage(named: "image_③")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate), style: .plain, target: vc, action: #selector(ViewController.btnNaviTapped③(sender:)))

そして、アクションが発生したタイミングで
btnNavi③.tintColor = UIColor.red
としたところ、無事にボタン③の色だけ、赤に変わりました。
ありがとうございました。

投稿2019/04/22 02:56

msa_winnie

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akaakoz

2019/04/22 03:13

あと色をボタンタップ毎に変えるのは以下のような感じでやります。(uibarbuttonitemのケース) navigationItem.rightBarButtonItem = UIBarButtonItem(image: "image"), style: .plain, target: self, action: #selector(handleNavButton)) navigationItem.rightBarButtonItem?.tintColor = .white @objc func handleNavButton() { //もしtintカラーが白だったら赤に if navigationItem.rightBarButtonItem?.tintColor == .white { navigationItem.rightBarButtonItem?.tintColor = .red    //そんでもし赤だったら白に } else if navigationItem.rightBarButtonItem?.tintColor == .red { navigationItem.rightBarButtonItem?.tintColor = .white } }
msa_winnie

2019/04/22 04:07

akaakoz様、いつもお世話になっております。 色をボタンタップ毎に変える方法を教えていただきありがとうございます。 教えていただいた方法でタップごとに色を変えることができました。 ありがとうございました。 今後ともよろしくお願いいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問