web-dev-qa-db-ja.com

UINavigationbarの要素のティントカラーを変更する(iOS 11)

このコードを使用して、ナビゲーションバーの要素のティントカラーを変更しています。

_UINavigationBar.appearance().tintColor = theme.labelColor
_

ただし、これはiOS 11では機能しなくなりました。iOS11より前のバージョンでは、ナビゲーションバーのボタンはUINavigationButtonsでしたが、iOS 11では__UIModernBarButton_に変更されました。 UIButton.appearance().tintcolorを使用してティントカラーを変更できましたが、それによってすべてのボタンが変更されます。

ここに比較があります:

iOS 10 Vs. 11 UINavigationBar button ナビゲーションバーのボタンの濃淡の色を変更する方法を知っている人はいますか?

UPDATE 01/09/2017:__UIButtonBarButton_は正しいティントカラーを持っているように見えますが、__UIModernBarButton_はそれをカラーセットで上書きしますUIButtonの場合。

更新2017年9月18日:

「エンジニアリングはこの問題に関して次のフィードバックを提供しました:

UIView.tintColorは外観セレクタではありません。具体的には、継承プロパティのために、外観プロパティとして正しく機能しないことが記載されています。」

19
Dan

だから私は一種の解決策を見つけました。 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
16
dehlen

これらの素晴らしい答えをありがとうございました。私にとって、これはトリックをしました:

[[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];

アプリ内のすべてのUIButtonsにカスタムカラーがあります([[UIButton appearance] setTintColor:]を使用)。これにより、iOS 11でtintColor(戻るボタンを含む)のUIBarButtonItemを変更することはできませんでした。tintColorを設定しようとしましたUINavigationBarで、私が顔が青くなるまで:すべて役に立たなかったので、このSOの質問を見つけ、最終的に正しい方向に向かってくれました(ありがとう!))。

コツは次のとおりです。UIButtontintColorに含まれている場合、nilUINavigationBarに設定します。これにより、UINavigationBarのtintColorがUIBarButtonItemに渡され、すべてが期待どおりに機能します。

今、私のviewWillAppear:メソッドで、これを簡単に行うことができます:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

戻るボタンを含むすべてのUIBarButtonItemsは白です。

1

あなたができる

[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];

これは機能しますが、プライベートクラスを使用しています(ただし、拒否されません

また、独自のUINavigationControllerサブクラスを作成して、必要な場所でのみ使用することもできます。

[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
0
Peter Lapisu

私は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];
0
schmru