Ich habe diesen Code verwendet, um die Farbtonfarbe eines Elements in der Navigationsleiste zu ändern:
UINavigationBar.appearance().tintColor = theme.labelColor
Dies funktioniert jedoch nicht mehr in iOS 11. Vor iOS 11 waren die Schaltflächen in der Navigationsleiste UINavigationButton
s, aber in iOS 11 wurden sie in _UIModernBarButton
geändert. Ich konnte ihre Tönungsfarbe mit UIButton.appearance().tintcolor
ändern, aber das ändert jeden Button.
Hier ist ein Vergleich:
Hat jemand eine Idee, wie Sie die Farbe der Schaltflächenfarbe in der Navigationsleiste ändern können?
UPDATE 01/09/2017: Sieht aus, als hätte _UIButtonBarButton
die richtige Farbtonfarbe, aber _UIModernBarButton
überschreibt diese mit der für UIButton
festgelegten Farbe.
UPDATE 18/09/2017:
"Das Engineering hat zu diesem Problem folgendes Feedback gegeben:
UIView.tintColor ist kein Erscheinungsbildselektor und wird insbesondere als nicht ordnungsgemäß funktionierende Eigenschaft aufgrund ihrer Vererbungseigenschaften dokumentiert. "
Also fand ich eine Lösung. Ich setze die Tönungsfarbe über den Darstellungs-Proxy für UIButton, aber nur, wenn sie in einer UINavigationBar enthalten ist. Das sieht so aus, als würde es für mich funktionieren. Allerdings hofft man immer noch, dass sich dieses Verhalten in iOS 11 GM ändern wird, oder jemand kann eine bessere Lösung finden. Hier ist mein Arbeitscode:
if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) {
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor];
}
Schnelle Version des Erscheinungsaufrufs:
UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red
Vielen Dank für all diese tollen Antworten. Für mich war das der Trick:
[[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];
Wir haben eine benutzerdefinierte Farbe für alle unsere UIButton
s in der App (mithilfe von [[UIButton appearance] setTintColor:]
). Auf diese Weise könnten wir unter tintColor
von UIBarButtonItem
(einschließlich der Schaltfläche "Zurück") unter iOS 11 niemals Änderungen vornehmen Ich hatte versucht, die tintColor
auf eine UINavigationBar
zu setzen, bis ich blau im Gesicht war: Alles ohne Erfolg. Dann fand ich diese SO Frage, und sie zeigte mir endlich die richtige richtung (danke!).
Der Trick ist folgender: Setzen Sie UIButton
s tintColor
auf nil
, wenn es in einem UINavigationBar
enthalten ist. Auf diese Weise wird die TintColor von UINavigationBar
an UIBarButtonItem
weitergegeben und alles funktioniert wie erwartet.
Nun kann ich in meiner viewWillAppear:
-Methode einfach Folgendes tun:
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
und alle meine UIBarButtonItem
s, einschließlich der Zurück-Taste, sind weiß.
Du könntest es tun
[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];
das funktioniert, aber Sie kribbeln mit einer Privatklasse ( dies wird Sie jedoch nicht abweisen )
sie können auch Ihre eigene UINavigationController-Unterklasse haben und diese nur dort verwenden, wo Sie es brauchen
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
Ich hatte das gleiche Problem, da die Schaltfläche "Zurück" in der Navigationsleiste nicht die Farbe war, die ich für UINavigationBar festgelegt habe:
[[UINavigationBar appearance] setBackgroundColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setBarTintColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setTintColor:COLOR_NAVIGATION_FOREG];
Endlich kam ich zur Lösung mit:
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:COLOR_NAVIGATION_FOREG];
Diese Linie legt die Farbe der Navigationsschaltfläche fest.
Ich würde auch hinzufügen, dass, wenn Sie die Schriftart der Navigationsschaltfläche ändern, Sie eine Linie hinzufügen müssen, um die Farbe des Texts zu ändern:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSFontAttributeName:FONT_MAIN_NAVIGATION} forState:UIControlStateNormal];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSForegroundColorAttributeName:COLOR_NAVIGATION_FOREG} forState:UIControlStateNormal];