2012-06-26 5 views
7

Mam UIWebView w mojej aplikacji, a problem polega na tym, że mam UIAppearance, który modyfikuje wygląd segmentowanych elementów sterujących, więc modyfikuje segmentowaną kontrolę w widoku akcesoriów wejściowych w przypadku pól tekstowych UIWebView chciałbym, aby wyglądał prawidłowo lub nie próbował go modyfikować. To, co w tej chwili wygląda następująco:iOS - Zapobieganie zmianom ustawień UIAWebView w widoku UIAWebView

+0

Mam ten sam problem. To doprowadza mnie do szału. – Jarsen

+0

To nie wydaje się być ustawienia wyglądu dla UISegmentedControl, ale wygląd dla UIToolbar, nie jestem pewien, ale nie mogę wydawać się naprawić to bez usuwania moich wyglądy.Wydaje się również, że nie ma łatwego i bezpiecznego sposobu na proste usunięcie paska narzędzi z UIWebView – 8vius

+0

Tak, wydaje się, że problem polega na tym, że zmienia alfa w niezaznaczonym obszarze segmentowanego kontrolera. Zastanawiam się, czy ma to związek z tym, że sam pasek UIToolbar jest przezroczysty. – Jarsen

Odpowiedz

5

po prostu rozwiązać ten problem dla siebie za pomocą [UIAppearance appearanceWhenContainedIn:] zamiast [wyglądem UIAppearance].

Użyj go, wysyłając selektor do listy zakończonych znakiem zerowym wszystkich niestandardowych klas ViewController zawierających elementy, które chcesz dostosować. Więc zamiast

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

użytku

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

Nie trzeba notować wszystkie ViewControllers, tylko te swoje najwyższego poziomu. To również umożliwia następującą sztuczkę: Utwórz "pustą" podklasę CustomizedViewController z UIViewController, który nie robi nic innego, jak tylko być podklasą - i następnie podklasuj tam w twoim kodzie zamiast UIViewController (w zasadzie zastępuje wszystkie wystąpienia 'UIViewController' za pomocą 'CustomizedViewController' . - z wyjątkiem przypadków, CustomizedViewController faktycznie zadeklarowana UIViewController jako nadrzędnej

Następnie użyj

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

Straciłem wiarę w to, że dostaję odpowiedź, postrzelę później, Stefano. Dziękuję Ci. – 8vius

+2

Niestety, projekt, nad którym pracuję, ma setki klas rozłożonych na wiele zespołów za pomocą kodu, nad którym nie mam kontroli. Piękno UIAppearance polega na tym, że (teoretycznie) nie muszę zadzierać z klasami, które próbuję skosić. Nie mogę przejść przez każdą klasę, którą chcę skroić i dać im wspólną superklasę tylko po to, aby UIAppearance zadziałał. Być może gdyby jabłko zawierało wygląd, gdybym nie była w stanie, to przynajmniej mogłem powstrzymać stylizację dla UIToolbarów w UIWebView ... – tyler

+0

Dla mnie to nie działa ... Kiedy przedstawiłem kontroler widoku z widokiem WWW, pasek narzędzi miał domyślny wygląd, ale pasek narzędzi klawiatury dostosowane – HotJard

2

Ok, więc byłem w końcu w stanie zorientować się, obejście tego Patrz mój komentarz na temat obecnej odpowiedź, która wyjaśnia dlaczego. odpowiedź nie działa dla mnie

Aby ponownie przetworzyć, z tego, co mogę powiedzieć, kod iOS, który tworzy akcesoria klawiatury, jawnie ustawia tło UIToolbar, więc nie dostaniesz ustawienia tła UIAppance, ale otrzymasz styl UIBarButtonItem. Rezultatem jest widok w połowie stylu, który może wyglądać bardzo źle. Na szczęście mój projektant miał się dobrze wracając do domyślnego stylu w tym konkretnym przypadku.

Sztuczka polegała na tym, aby dowiedzieć się, jak uzyskać ten widok, aby NIE był stylizowany przez UIAppearance. Sposób, w jaki to zrobił było zastąpienie tego:

id barButtonAppearanceProxy = [UIBarButtonItem appearance]; 

z tym:

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

To wydawało mi się dziwne, bo w pierwszej chwili myślał o ograniczaniu w kategoriach view-heirarchy ... Ale to jest po prostu powiedzenie, że będziemy tylko stylizować elementy UIBarButtonItems, które są powiązane z kontrolkami UIViewController. Powodem, dla którego nie ma to wpływu na akcesoria klawiatury, jest to, że dodano bezpośrednio okno widoku rodzica i nie jest ono powiązane z kontrolerem UIViewController.

To wciąż nie jest doskonałe rozwiązanie, ponieważ idealnie byłoby po prostu stylizować akcesorium do klawiatury za pomocą UIAppearance. Zakłada również, że wszystkie paski narzędzi są powiązane z kontrolkami UIViewController. Na szczęście dla mnie (i prawdopodobnie większości z was) tak się zwykle dzieje.

Powiązane problemy