2012-06-26 12 views
7

Tengo una UIWebView en mi aplicación, y el problema es que tengo una UIAppearance que modifica la apariencia de controles segmentados, por lo que modifica el control segmentado en la vista de accesorio de entrada para campos de texto UIWebView, me gustaría que se vea correctamente o no intente modificarlo. Esto es lo que actualmente se ve como:iOS: evitar que la configuración de UIAppearance cambie la vista de accesorio de entrada UIWebView

+0

Tengo el mismo problema. Me está volviendo loco. – Jarsen

+0

No parece ser la configuración de apariencia para UISegmentedControl, pero la apariencia de la UIToolbar, no estoy muy seguro, pero parece que no puedo solucionarlo sin quitar mis apariencias.También parece que no hay una manera fácil y segura de simplemente eliminar la barra de herramientas de UIWebView – 8vius

+0

Sí, parece que el problema es que está cambiando el alfa del área no seleccionada del controlador segmentado. Me pregunto si tiene que ver con la UIToolbar teniendo transparencia. – Jarsen

Respuesta

5

simplemente he resuelto este problema por mí mismo mediante el uso de [UIAppearance appearanceWhenContainedIn:] en lugar de [apariencia UIAppearance].

Utilícelo enviando al selector una lista de todas sus clases personalizadas de ViewController que contienen los elementos que desea personalizar. Así que en lugar de

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

uso

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

No es necesario enumerar todas las ViewControllers, sólo sus más alto nivel. Esto también hace posible el siguiente truco: Crear una subclase 'vacía' CustomizedViewController de UIViewController que no hace más que ser una subclase, y luego subclase desde allí a través de tu código en lugar de UIViewController (básicamente reemplaza todas las ocurrencias de 'UIViewController' con 'CustomizedViewController' -., excepto cuando CustomizedViewController realidad declaró UIViewController como su superclase

a continuación, utilizar

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

Había perdido la fe de que alguna vez me respondieran, daré una oportunidad más tarde, Stefan. Gracias. – 8vius

+2

Por desgracia, el proyecto que estoy trabajando tiene cientos de clases que están en varios equipos utilizando código que no tiene control. La belleza de UIAppearance es que (en teoría) no tengo que meterme con las clases que trato de despellejar. No puedo revisar todas las clases que quiero exponer y darles una superclase común para que UIAppearance funcione. Tal vez si Apple hubiera incluido una apariencia. Cuando no esté contento, al menos podría suprimir el estilo de UIToolbars dentro de UIWebView ... – tyler

+0

Para mí no funciona ... Cuando presenté el controlador de vista con vista web, la barra de herramientas tenía apariencia predeterminada, pero la barra de herramientas del teclado personalizado – HotJard

2

Ok, por lo que finalmente fue capaz de encontrar una solución para este ver mi comentario sobre la respuesta actual que explica por qué. la respuesta no funciona para mí.

Para volver a iterar, por lo que puedo decir, el código de iOS que está creando el accesorio de teclado está configurando explícitamente el fondo de la fondo de la UIToo, por lo que no obtendrá la configuración de fondo de UIAppearance, pero obtendrá su estilo de UIBarButtonItem. El resultado es una vista de estilo medio, que puede verse bastante mal. Afortunadamente, mi diseñador estuvo de acuerdo en volver al estilo predeterminado para este caso en particular.

Así que, el truco fue realmente encontrar la manera de lograr que esa vista NO se estilizara a través de UIAppearance. La forma en que hice esto fue reemplazar esto:

id barButtonAppearanceProxy = [UIBarButtonItem appearance]; 

Con esta:

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

Esto parecía extraño para mí al principio, porque yo estaba pensando en términos de contención en una vista jerarquía ... Pero esto solo indica que solo haremos un estilo de UIBarButtonItems asociados con UIViewController. La razón por la que esto no afecta al accesorio de teclado es porque se agrega directamente a la ventana de la vista principal y no está asociado con un UIViewController.

Todavía no es una solución perfecta ya que lo ideal es que acabemos de diseñar el accesorio de teclado con UIAppearance. Además, asume que todas sus barras de herramientas están asociadas con UIViewControllers. Afortunadamente para mí (y probablemente para la mayoría de ustedes) este suele ser el caso.

Cuestiones relacionadas