2012-06-26 9 views
7

Ich habe ein UIWebView in meiner App, und das Problem ist, dass ich ein UIA-Erscheinungsbild habe, das die Darstellung von segmentierten Steuerelementen ändert und das segmentierte Steuerelement in der Eingabezubehöransicht ändert Für UIWebView-Textfelder möchte ich, dass es richtig aussieht oder nicht versucht, es zu ändern. Dies ist, was es sieht derzeit wie:iOS - Verhindern, dass UIAppearance-Einstellungen sich ändern UIWebView-Eingabezubehöransicht

+0

Ich habe das gleiche Problem. Es macht mich verrückt. – Jarsen

+0

Es scheint nicht die Aussehen Einstellungen für die UISegmentedControl, aber das Aussehen für die UIToolbar, ich bin mir nicht ganz sicher, aber ich kann nicht scheinen, es zu beheben, ohne meine Erscheinungsbilder zu entfernen.Es scheint auch, als gäbe es keine einfache und sichere Möglichkeit, die Toolbar einfach aus UIWebView zu entfernen. – 8vius

+0

Ja, es scheint, als ob das Problem darin besteht, das Alpha des nicht ausgewählten Bereichs des segmentierten Controllers zu ändern. Ich frage mich, ob es damit zu tun hat, dass die UIToolbar selbst transparent ist. – Jarsen

Antwort

5

ich dieses Problem für mich einfach gelöst, indem Sie [UIAppearance appearanceWhenContainedIn:] statt [UIAppearance Aussehen].

Verwenden Sie diese Option, indem Sie dem Selektor eine Liste aller benutzerdefinierten ViewController-Klassen senden, die alle Elemente enthalten, die Sie anpassen möchten. Also statt

[[UISegmentedControl appearance] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Verwendung

[[UISegmentedControl appearanceWhenContainedIn:[MyViewController class], [MyOtherViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Sie brauchen nicht alle Viewcontrollers aufzulisten, nur Ihre Top-Level diejenigen. Dies macht auch den folgenden Trick möglich: Erstellen Sie eine 'leere' Unterklasse CustomizedViewController von UIViewController, die nichts anderes tut, als eine Unterklasse zu sein - und dann von dort innerhalb Ihres Codes statt von UIViewController eine Unterklasse (ersetzen Sie im Prinzip alle Vorkommen von 'UIViewController' durch 'CustomizedViewController' -. es sei denn, CustomizedViewController erklärt tatsächlich UIViewController als übergeordnete Klasse

verwenden Dann

[[UISegmentedControl appearanceWhenContainedIn:[CustomizedViewController class], nil] setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
+0

Ich hatte den Glauben daran verloren, jemals beantwortet zu werden, ich gebe später eine Chance, Stefan. Vielen Dank. – 8vius

+2

Leider hat das Projekt, an dem ich arbeite, Hunderte von Klassen, die sich über mehrere Teams erstrecken und Code verwenden, über den ich keine Kontrolle habe. Das Schöne an UIAppearance ist, dass ich mich (theoretisch) nicht mit den Klassen herumschlagen muss, die ich auszubessern versuche. Ich kann nicht jede Klasse, die ich ausmalen möchte, durchlaufen und ihnen eine gemeinsame Superklasse geben, nur um UIAppearance zum Laufen zu bringen. Vielleicht, wenn Apple hatte eine AppearanceWhenNotContainedIn-Methode könnte ich zumindest unterdrücken Styling für UIToolbars in einem UIWebView ... – tyler

+0

Für mich funktioniert es nicht ... Wenn ich den View-Controller mit Web-Ansicht präsentierte, war Symbolleiste mit Standard-Darstellung, aber Tastatur-Symbolleiste angepasst – HotJard

2

Ok, also war ich endlich in der Lage eine Lösung für diese, um herauszufinden, sehen Sie meinen Kommentar auf die aktuelle Antwort, warum das erklärt. Antwort funktioniert nicht für mich

Um zu wiederholen, was ich sagen kann, ist der iOS-Code, der das Tastaturzubehör erstellt explizit den UIToolbar Hintergrund, so dass Sie nicht Ihre UIAppearance Hintergrundeinstellung erhalten, aber Sie erhalten Ihre UIBarButtonItem Styling. Das Ergebnis ist eine halb gestylte Ansicht, die ziemlich schlecht aussehen kann. Glücklicherweise hatte mein Designer kein Problem damit, für diesen speziellen Fall auf das Standard-Styling zurückzugreifen.

Also, der Trick war wirklich herauszufinden, wie diese Ansicht nicht über UIAppearance gestylt wird. Die Art, wie ich dies tat, war dies zu ersetzen:

id barButtonAppearanceProxy = [UIBarButtonItem appearance]; 

mit diesem:

// wtf: Style any UIBarButtonItem associated with a UIViewController 
id barButtonAppearanceProxy = [UIBarButtonItem appearanceWhenContainedIn:[UIViewController class], nil]; 

Dies schien seltsam für mich zunächst, weil ich im Hinblick auf eine Blick-Hierarchie der Eindämmung zu denken ... Aber das heißt nur, dass wir nur UIBarButtonItems formatieren, die mit UIViewControllers verknüpft sind. Der Grund, warum dies das Tastaturzubehör nicht betrifft, liegt daran, dass es direkt dem Fenster der übergeordneten Ansicht hinzugefügt wurde und nicht mit einem UIViewController verknüpft ist.

Dies ist immer noch keine perfekte Lösung, da wir im Idealfall das Tastaturzubehör mit UIAppearance stylen würden. Außerdem wird davon ausgegangen, dass alle Ihre Symbolleisten UIViewControllers zugeordnet sind. Zum Glück für mich (und wahrscheinlich die meisten von euch) ist das typischerweise der Fall.

Verwandte Themen