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

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

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

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

Swift

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

Q&A

解決済

1回答

1152閲覧

UISliderを使ってTabBarの各種色変更[RGB]は可能ですか?

Ytan

総合スコア39

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/09/23 10:06

編集2020/09/24 16:47

ある一つのViewControllerで3つUISliderでUITabBarの全てのViewの色を変更したいのです。

下記のようなUISliderでRGBColor変更をするものを作ったのですが、
UITabBar.appearance().UITabBarControllerもしくはSceneDelegateAppDelegateで明示しないと変更が施されないと思うのですが、SwiftではUISliderを使って
UITabBarの各種色の変更はできるのですか?可能な場合どうすればよいですか?

@IBOutlet weak var slider1: UISlider! @IBOutlet weak var slider2: UISlider! @IBOutlet weak var slider3: UISlider! @IBAction func redSlider(_ sender: Any) { var redValue = CGFloat(slider1.value) var greenValue = CGFloat(slider2.value) var blueValue = CGFloat(slider3.value) backGround.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1) } @IBAction func greenSlider(_ sender: Any) { var redValue = CGFloat(slider1.value) var greenValue = CGFloat(slider2.value) var blueValue = CGFloat(slider3.value) UITabBar.appearance().barTintColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1) } @IBAction func blueSlider(_ sender: Any) { var redValue = CGFloat(slider1.value) var greenValue = CGFloat(slider2.value) var blueValue = CGFloat(slider3.value) UITabBar.appearance().barTintColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1) }

追記
UIAppearanceをUIViewCOntrollerで呼んでも変更が施されない理由

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでしょうか。

イメージ説明

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var redSlider: UISlider! 5 @IBOutlet weak var greenSlider: UISlider! 6 @IBOutlet weak var blueSlider: UISlider! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 redSlider.value = 0.5 12 greenSlider.value = 0.5 13 blueSlider.value = 0.5 14 15 changeTabBackgroundColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value) 16 17 // isTranslucet == false だと色の変更が効かない 18 tabBarController?.tabBar.isTranslucent = true 19 20 // UITabBar の背景を入れ替える 21 //UITabBar.appearance().backgroundImage = UIImage() 22 tabBarController?.tabBar.backgroundImage = UIImage() 23 } 24 25 // 3つのスライダー全ての Action を一つにまとめる 26 @IBAction func sliderValueChanged(_ sender: UISlider) { 27 changeTabBackgroundColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value) 28 } 29 30 func changeTabBackgroundColor(red: Float, green: Float, blue: Float) { 31 tabBarController?.tabBar.backgroundColor = UIColor(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: 1.0) 32 } 33}

投稿2020/09/23 12:34

TsukubaDepot

総合スコア5086

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

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

Ytan

2020/09/24 03:34

3つのスライダー全ての Action を一つにまとめるというとこなのですがどのSliderを紐付けているのですか?一つのみだとgreenとblueを動かしても反映されずredを動かした時のみ全ての変更が反映されますよね?
TsukubaDepot

2020/09/24 10:07

@IBAction はUI部品に対して必ずしも一対一対応する必要はありません。 たとえば、赤色用のスライダからコード側に引っ張ってきた後、今度は@IBAction の左側にある◉を別のスライダにドラッグすると、関連づけられた全てのUI部品から同じメソッドが呼び出されるようになります。 さらに、呼び出されるメソッドも同じUI部品である必要はなく(なので、デフォルト引数が Any になっている)、違う種類の部品を一つのメソッドで処理することも可能です。 今回の場合、sliderValueChangedを3つのスライダと関連づけることで、3つのスライダいずれを動かしても同じメソッドが呼ばれるようにしてあります。ご質問のコードを拝見すると、3つのスライダに個別のメソッドを割り当てていますが、実は全て同じ処理なので、このようにしてまとめた方が保守は簡単になるかと思います。
Ytan

2020/09/24 14:06

同じメソッドを呼べたのですね、知りませんでした。 解決しました。教えてくださりありがとうございました。
TsukubaDepot

2020/09/24 14:11

全てコードベースでプログラミングした場合、どのUI部品であっても、addTarget で同じメソッドを呼び出せるわけですから(しかも引数の数も同じ)、よく考えれば当然なのですが、私もとある書籍を読んでいて知って眼から鱗が落ちたことがありました。
Ytan

2020/09/24 14:40

差し支えなければお尋ねしたいのですが、 tabBarController?.tabBar.backgroundImage = UIImage()でTabの背景の色では無く背景そのものを変更している?と思うのですが文字を同じ様にを変える場合はUITabBar.appearance().tintColor = UIColor.redではないということですか? また気になる点が一つあるので画像を追加しましたのでよろしければ教えてもらいたいです。
TsukubaDepot

2020/09/24 15:38

上記の件ですが、本質的な質問内容が当初の質問と異なってしまっているため、こういう場合には改めて質問を立てていただけないでしょうか。 仮に他の回答者が回答を持っていたとしても、途中で別の内容の質問が追加されてもそれに気づくことができません(全ての疑問に答えら得るほど、私は技量を持たないため)。 よろしくお願いします。
TsukubaDepot

2020/09/24 15:39

ちなみに、図を見るとTabBarではなくてNavigationBarのようですが、それも明確にしていただければと思います(たしか、NavigatonBarの場合はまた異なっていたような気もします)。
Ytan

2020/09/24 15:52

そうですね、分かりました。 内容を整理して不明な点がありましたら再度質問します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問