UISplitView Controller: UISearchController und tintColor

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • UISplitView Controller: UISearchController und tintColor

    Hallo zusammen,

    ich habe (mal wieder) ein recht spezielles Problem: Wer von Euch verwendet einen UISearchController in der MasterView einer UISplitView mit barTintColor?

    Meine App auf Basis des UISplitViewControllers setzt für die UINavigationBar eine barTintColor:

    Quellcode

    1. /// UI appearance: Navbar colored with white elements (title, buttons), view with colored elements, e.g. icons
    2. UINavigationBar.appearance.barTintColor = [UIColor colorNamed:@"CO_TintColor"];
    3. UINavigationBar.appearance.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
    4. UINavigationBar.appearance.tintColor = [UIColor whiteColor];
    5. [[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]] setTintColor:[UIColor whiteColor]];
    6. /// UI appearance: Searchbar colored with white elements (title, buttons), view with colored elements, e.g. icons
    7. UISearchBar.appearance.barTintColor = [UIColor colorNamed:@"CO_TintColor"];
    8. UISearchBar.appearance.tintColor = [UIColor whiteColor];
    9. // UIView tintColor for icons in tableview cells
    10. [[UIView appearanceWhenContainedInInstancesOfClasses:@[UITableViewCell.class]] setTintColor:[UIColor colorNamed:@"CO_TintColor"]];
    Alles anzeigen
    Das klappt soweit wie erwartet. Nun habe ich der MasterView einen UISearchController hinzugefügt - übrigens nach längerem Probieren im viewDidAppear:, weil sonst die Anzeige bei Rotationen komplett zerhackstückt wird. Nun habe ich folgenden Effekt:
    • Wische ich in der TableView nach unten, um die SearchBar zu sehen, verliert die NavigationBar ihre Hintergrundfarbe (Screenshot #1)

    • Gebe ich einen Suchtext ein, wird die Navigationbar richtig eingefärbt (Screenshot #2)

    • Drücke ich auf "Cancel" bin ich wieder am Anfangsstatus: Keine Hintergrundfarbe (Screenshot #1)
    Ich habe schon x Sachen erfolglos probiert, einen logischen Fehler sehe ich gar nicht. Nun bin ich kurz davor, die Farbgebung der App so zu ändern, dass nur eine tintColor und keine barTintColor gesetzt wird ... dann funktioniert es nämlich. Aber eigentlich möchte ich das nicht... :)

    Wer von Euch verwendet einen SearchController in einer SplitView mit barTintColor ... und was mache ich falsch?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So, das Problem ist nach zwei Tagen Suchen und Probieren gelöst ... Apple, ich könnte manchmal schreien!

    Die Langform:

    Nach dem Posten hier habe ich zum x-ten Mal mein Google-fu probiert, diesmal auf die richtigen Schlüsselwörter reduziert: "barTintColor UISearchController" ... keine Ahnung, was ich vorher alles probierte, warum und mit welchen Suchresultaten. Nun landete ich aber auf einer Diskussion in den Apple-Foren. Der Autor elementarteilchen beschrieb exakt mein Problem (ist das jemand von Euch?) und auch den entscheidenen Hinweis zur Lösung: Was macht man, wenn eine API ein Problem unzureichend löst? Genau, man entwickelt eine neue API X(

    Okay, das war polemisch - schreibt es meiner aktuellen Gemütslage zu. In der in iOS 13 neuen Klasse UINavigationBarAppearance gibt es eine Eigenschaft scrollEdgeAppearance, die genau im oben genannten Fall zieht, nämlich wenn der Inhalt einer enthaltenen ScrollView an die Bar stößt. Mit dem folgenden Code in meinem SceneDelegate funktioniert es nun wie gewünscht:

    C-Quellcode

    1. // UI appearance: Navbar colored with white elements (title, buttons), view with colored elements, e.g. icons
    2. UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
    3. appearance.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
    4. appearance.backgroundColor = [UIColor colorNamed:@"CO_TintColor"];
    5. UINavigationBar.appearance.standardAppearance = appearance;
    6. UINavigationBar.appearance.scrollEdgeAppearance = appearance;
    7. UINavigationBar.appearance.tintColor = [UIColor whiteColor];
    8. // UIView tintColor for icons in tableview cells
    9. [[UIView appearanceWhenContainedInInstancesOfClasses:@[UITableViewCell.class]] setTintColor:[UIColor colorNamed:@"CO_TintColor"]];
    Alles anzeigen
    Einen schönen Sonntag noch, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Nun bin ich kurz davor, die Farbgebung der App so zu ändern, dass nur eine tintColor und keine barTintColor gesetzt wird ... dann funktioniert es nämlich. Aber eigentlich möchte ich das nicht... :)
    Das scheint momentan aber (noch?) die beste Idee zu sein: Die farbige Navigation-Bar mit weißem Text führt spätestens beim UIActivityViewController für viel Spass. Zum Beispiel der Druckdialog und der zum Hinzufügen eines Bildes zu einem Kontakt verhalten sich nämlich genau konträr (siehe hier). Und auch der UIImagePickerController braucht eine Sonderbehandlung.

    Ich werde nun doch bei einer standardmäßigen barTintColor bleiben...

    Mattes

    Edit: Die Lösung ist eine custom UINavigationBar, die man dann auch in <UIAppearance> referenzieren kann.
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes ()