2010-03-31 23 views
33

Estoy trabajando en una aplicación de iPad y estoy usando UIPopoverControllers. Estoy en la parte donde la aplicación necesita ser marcada y diseñada y me pregunto cómo cambiar el color/tinte del UIPopoverController. El estándar es de color azul oscuro pero debe ser de otro color ...Cómo personalizar/diseñar un UIPopoverController

¿Esto es posible?

Greets, Thomas

+0

Btw, irc.freenode.net #ipaddev es el lugar para estar. – Sneakyness

+0

Oye, Madhup, fuiste capaz de personalizar el control emergente de tu aplicación – sandy

Respuesta

21

Es imposible por ahora.

Es lo que llamo el modelo "Caja en una caja". Obtienes el control de la caja dentro de la caja (UIViewController dentro del UIPopoverController), pero tienes un control muy limitado sobre el mismo popover. Fuera de la dirección de la flecha y el tamaño, no puedes cambiar mucho más. También hay opciones para un efecto modal popover, que atenúa todo lo demás cuando aparece, pero no he intentado hacerlo funcionar.

Estoy seguro de que ya has notado que no hay clase UIPopover.

La respuesta que desea escuchar:
Si realmente quiere el estilo de uno que está mal, sólo escribir el suyo propio. Realmente no es tan difícil.

El enlace que desea hacer clic en:
Cocoacontrols es un índice de los componentes iOS y OSX disponible en GitHub, they have some popover stuff.

+7

Desde iOS5, ahora puedes simplemente subclase UIPopoverBackgroundView y devolver tu subclase a popoverBackgroundViewClass. – steipete

-1

Sé que esto es una respuesta construida pésimo, pero he estado jugando con las vistas de UIPopoverController. Ellos existen

La única forma de acceder a ellos es desde la vista que está instalada en el UIPopovercontroller.

Tengo un controlador de navegación así que sigo esta jerarquía

UIView *test = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]); 
UIView *test2 = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]); 
test.backgroundColor = [UIColor greenColor]; 
test2.backgroundColor = [UIColor greenColor]; 

Esto no es exactamente el objetivo final, pero está muy cerca.

encontrará que the_view_in_the_popover.superview.superview (tal vez solo una supervista si no está llegando desde una vista del controlador de navegación) es un UIPopoverView. Si lo haces como un UIView y lo tratas como un UIView, en realidad no estás rompiendo ninguna regla. Sin embargo, creo que eso está realmente a la altura de la manzana.

+0

que no funcionará demasiado bien: se superpondrá a un cuadrado de color detrás de la vista de popover. – Pripyat

+2

Tienes razón. Creo que mi objetivo con mi respuesta fue simplemente ayudar a las personas a sumergirse en la jerarquía, realmente no tengo tiempo en este momento para dar una solución completa. – maxpower

0

trato de engañar que al personalizar el controlador de vista dentro de la popover y luego ocultar la frontera popover utilizando este código:

UIView * border = [[insideViewController.view.superview.superview.superview subviews] objectAtIndex:0]; 
border.hidden = YES; 

La aplicación es en realidad todavía en desarrollo, así que espero que otras personas comentarán en esta solución.

+8

Muy frágil. Si Apple decide cambiar algo en la jerarquía de vista de popover, este código se derrumbará. – DarkDust

51

Esto es posible a partir de iOS 5.0 como subclase la clase abstracta UIPopoverBackgroundView y la asignación de la subclase a la propiedad popoverBackgroundViewClass en su UIPopoverController ejemplo. Desafortunadamente no existe la propiedad tintColor ya que Popover necesita usar imágenes para su flecha y borde para lograr animaciones fluidas durante el cambio de tamaño dinámico.Usted puede aprender más acerca de cómo personalizar la apariencia de un UIPopoverController en el UIPopoverBackgroundView Class Reference

-3

Retire UIPopoverController frontera:

NSArray* subviews = ((UIView*)[popupController.contentViewController.view.superview.superview.superview.subviews objectAtIndex:0]).subviews; 
for(UIView *subview in subviews){ 
    [subview removeFromSuperview]; 
} 
+2

-1 Nunca asuma la estructura de una jerarquía de vistas. – rbrown

8

Lanzar el sombrero aquí;

He aprovechado UIPopoverBackgroundView s en iOS 5+ para agregar una propiedad simple tintColor al UIPopoverController s.

PCPopoverController: https://github.com/pcperini/PCPopoverController

+0

¿Ha hecho algún ejemplo? – Hiren

+1

No creo que haya nada, pero no podría ser más fácil. solo use '-initWithContentViewController: andTintColor:' en lugar de '-initWithContentViewController:'. El resto es lo mismo que 'UIPopoverController'. –

+0

+1 cosas agradables para el controlador popover para color personalizado. Bastante útil. –

13

iOS 7 introduce backgroundColor propiedad de UIPopoverController que afecta/incluye el color de fondo de navegación, así como las flechas de popover. ejemplo

@property (nonatomic, copy) UIColor *backgroundColor NS_AVAILABLE_IOS(7_0); 

Uso:

if ([self.popoverVC respondsToSelector:@selector(setBackgroundColor:)]) { // Check to avoid app crash prior to iOS 7 
     self.popoverVC.backgroundColor = [UIColor greenColor]; // [UIColor colorWithPatternImage:@"..."] doesn't reflect the color on simulator but on device it works! 
    } 

Nota - A partir de ahora (iOS 7.0.3), en algunos casos (como el color conjunto utilizando colorWithPatternImage :), el simulador (e incluso algunos dispositivos) no respeta el color.

+0

Y esto incluye el uso del canal alfa para tener popovers transparentes o parcialmente transparentes, p. popoverController.backgroundColor = UIColor (blanco: 1, alfa: 0.5) –

+0

No olvides cambiar también el color/alfa de la vista dentro de tu popover y los controles dentro de esa vista. –

Cuestiones relacionadas