2010-03-31 21 views
33

Je travaille sur une application iPad et j'utilise UIPopoverControllers. Je suis à la partie où l'application doit être marquée et stylée et je me demande comment changer la couleur/la teinte de l'UIPopoverController? Standard est bleu foncé, mais il doit être une autre couleur ..Comment personnaliser/le style d'un UIPopoverController

est-ce possible? Salutations, Thomas

+0

Btw, irc.freenode.net #ipaddev est l'endroit à être. – Sneakyness

+0

Hey Madhup avez-vous été en mesure de personnaliser le contrôleur pop-over de votre application? – sandy

Répondre

21

Il est impossible pour l'instant.

C'est ce que j'appelle le modèle « boîte dans une boîte ». Vous obtenez le contrôle de la boîte à l'intérieur de la boîte (le UIViewController à l'intérieur du UIPopoverController), mais vous avez un contrôle très limité sur le popover lui-même. En dehors de la direction de la flèche et de la taille, vous ne pouvez pas changer beaucoup d'autre chose. Il y a aussi des options pour un popover à effet modal, qui obscurcit tout le reste quand il apparaît, mais je n'ai pas essayé de le faire fonctionner.

Je suis sûr que vous avez remarqué qu'il n'y a pas de classe UIPopover maintenant.

La réponse que vous voulez entendre:
Si vous voulez vraiment le style d'un mal que ça, il suffit d'écrire votre propre. Ce n'est vraiment pas si difficile.

Le lien que vous voulez cliquer:
Cocoacontrols est un index des composants iOS et OSX disponible sur GitHub, they have some popover stuff.

+7

Depuis iOS5, vous pouvez maintenant simplement sous-classer UIPopoverBackgroundView et renvoyer votre sous-classe à popoverBackgroundViewClass. – steipete

-1

Je sais que c'est une réponse construite moche, mais je viens de jouer avec les vues de UIPopoverController. Ils existent.

La seule façon d'y accéder est de votre point de vue qui est assis dans le UIPopovercontroller.

J'ai un contrôleur de navigation, donc je suis cette hiérarchie

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]; 

Ce n'est pas exactement l'objectif final, mais il est vraiment proche.

vous constaterez que the_view_in_the_popover.superview.superview (peut-être juste un aperçu si vous ne tendez pas la main à partir d'une vue de contrôleur de navigation) est un UIPopoverView. Si vous le convertissez en UIView et le traitez comme un UIView, vous ne brisez pas vraiment de règles. Je suppose que c'est vraiment à la hauteur de la pomme.

+0

qui ne fonctionnera pas trop bien - il va juste superposer un carré de couleur derrière la vue popover. – Pripyat

+2

Vous avez raison. Je pense que mon objectif avec ma réponse était simplement d'aider les gens à plonger dans la hiérarchie, je n'ai pas vraiment le temps maintenant de donner une solution complète. – maxpower

0

J'essaie de duper par la personnalisation du contrôleur de vue à l'intérieur du popover puis cacher la frontière popover en utilisant ce code:

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

L'application est en fait encore en développement donc j'espère d'autres personnes commenteront sur cette solution.

+8

Très fragile. Si Apple décide de changer quelque chose sur la hiérarchie de la vue popover, ce code se désagrégera. – DarkDust

51

Ceci est possible à partir de iOS 5.0 par la classe abstraite sous-classement UIPopoverBackgroundView et l'attribution de votre sous-classe à la propriété popoverBackgroundViewClass sur votre instance UIPopoverController. Malheureusement, il n'y a pas de propriété tintColor car le popover doit utiliser des images pour sa flèche et sa bordure afin de réaliser des animations fluides lors du redimensionnement dynamique.Vous pouvez en apprendre davantage sur la façon de personnaliser l'apparence d'un UIPopoverController dans le UIPopoverBackgroundView Class Reference

-3

Supprimer la bordure UIPopoverController:

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

-1 Ne supposez jamais la structure d'une hiérarchie de vues. – rbrown

8

Lancer mon chapeau ici;

J'ai exploité UIPopoverBackgroundView s dans iOS 5+ pour ajouter une propriété tintColor simple sur UIPopoverController s.

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

+0

un exemple avez-vous fait? – Hiren

+1

Je ne crois pas qu'il y en ait, mais ça ne pourrait pas être plus facile. il suffit d'utiliser '-initWithContentViewController: etTintColor:' au lieu de '-initWithContentViewController:'. Le reste est le même que 'UIPopoverController'. –

+0

+1 choses sympa pour le contrôleur popover pour la couleur personnalisée. Assez utile. –

13

iOS 7 introduit la propriété backgroundColor de UIPopoverController qui affecte/comprend la couleur d'arrière-plan de navigation, ainsi que des flèches de popover.

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

Exemple d'utilisation:

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! 
    } 

Remarque - A partir de maintenant (iOS 7.0.3), dans certains cas (comme jeu couleur à l'aide colorWithPatternImage :), le simulateur (et même certains appareils) n'honore pas la couleur.

+0

Et ceci inclut l'utilisation du canal alpha pour avoir des popovers transparents ou partiellement transparents, par ex. popoverController.backgroundColor = UIColor (blanc: 1, alpha: 0.5) –

+0

N'oubliez pas de changer la couleur/alpha de la vue dans votre popover et les contrôles dans cette vue, le cas échéant. –