このコードを使用して、ナビゲーションバーの要素のティントカラーを変更しています。
_UINavigationBar.appearance().tintColor = theme.labelColor
_
ただし、これはiOS 11では機能しなくなりました。iOS11より前のバージョンでは、ナビゲーションバーのボタンはUINavigationButton
sでしたが、iOS 11では__UIModernBarButton
_に変更されました。 UIButton.appearance().tintcolor
を使用してティントカラーを変更できましたが、それによってすべてのボタンが変更されます。
ここに比較があります:
ナビゲーションバーのボタンの濃淡の色を変更する方法を知っている人はいますか?
UPDATE 01/09/2017:__UIButtonBarButton
_は正しいティントカラーを持っているように見えますが、__UIModernBarButton
_はそれをカラーセットで上書きしますUIButton
の場合。
更新2017年9月18日:
「エンジニアリングはこの問題に関して次のフィードバックを提供しました:
UIView.tintColorは外観セレクタではありません。具体的には、継承プロパティのために、外観プロパティとして正しく機能しないことが記載されています。」
だから私は一種の解決策を見つけました。 UIButtonの外観プロキシを介してティントカラーを設定していますが、UINavigationBarに含まれている場合のみです。これは私にとってはうまくいっているようです。ただし、この動作がiOS 11で変更されることを期待していますGMまたは誰かがより良い解決策を考え出すことができます。これが私の作業コードです:
if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) {
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor];
}
Swiftバージョンの外観プロキシ呼び出し:
UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red
これらの素晴らしい答えをありがとうございました。私にとって、これはトリックをしました:
[[UIButton appearance] setTintColor:someDefaultColorForAllButtons];
/**
* Starting with iOS 11, UIBarButtonItems actually have a UIButton subview.
* That means that the [UIButton appearance]'s tintColor will override whatever
* tintColor would normally be set or passed-through to the barButtonItem (usually
* the UINavigationBar's tintColor). That's why we un-set the tintColor for
* UIButton when it's contained in an instance of UINavigationBar.
*/
[[UIButton appearanceWhenContainedIn:UINavigationBar.class, nil] setTintColor:nil];
アプリ内のすべてのUIButton
sにカスタムカラーがあります([[UIButton appearance] setTintColor:]
を使用)。これにより、iOS 11でtintColor
(戻るボタンを含む)のUIBarButtonItem
を変更することはできませんでした。tintColor
を設定しようとしましたUINavigationBar
で、私が顔が青くなるまで:すべて役に立たなかったので、このSOの質問を見つけ、最終的に正しい方向に向かってくれました(ありがとう!))。
コツは次のとおりです。UIButton
がtintColor
に含まれている場合、nil
をUINavigationBar
に設定します。これにより、UINavigationBar
のtintColorがUIBarButtonItem
に渡され、すべてが期待どおりに機能します。
今、私のviewWillAppear:
メソッドで、これを簡単に行うことができます:
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
戻るボタンを含むすべてのUIBarButtonItem
sは白です。
あなたができる
[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];
これは機能しますが、プライベートクラスを使用しています(ただし、拒否されません)
また、独自のUINavigationControllerサブクラスを作成して、必要な場所でのみ使用することもできます。
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
私はUINavigationBarに設定した色ではないナビゲーションバーの戻るボタンで同じ問題がありました:
[[UINavigationBar appearance] setBackgroundColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setBarTintColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setTintColor:COLOR_NAVIGATION_FOREG];
最後に私は解決策を得ました:
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:COLOR_NAVIGATION_FOREG];
この行は、ナビゲーションボタンの色を設定します。
ナビゲーションボタンのフォントを変更する場合は、テキストの色を変更するために行を追加する必要があることも追加します。
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSFontAttributeName:FONT_MAIN_NAVIGATION} forState:UIControlStateNormal];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSForegroundColorAttributeName:COLOR_NAVIGATION_FOREG} forState:UIControlStateNormal];