web-dev-qa-db-de.com

Ändern der Tönungsfarbe von Elementen in UINavigationbar (iOS 11)

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 UINavigationButtons, 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:

 iOS 10 Vs. 11 UINavigationBar button 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. "

19
Dan

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
16
dehlen

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 UIButtons 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 UIButtons 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 UIBarButtonItems, einschließlich der Zurück-Taste, sind weiß.

1

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]];
0
Peter Lapisu

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