69 votes

UIPopoverController redimensionnant automatiquement à la hauteur maximale sur pushViewController

J'ai une liste contenant un UINavigationController. Je peux afficher la liste amende, et il contient les navController l'amende juste. Le navController contient une tableView et lorsque je sélectionne un élément, il crée une nouvelle vue de détail:

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

J'ai ensuite pousser le nouveau-vue-contrôleur:

    [self.navigationController pushViewController:detailViewController animated:YES];

C'est lorsque le problème se produit: après poussant la nouvelle vue à la liste redimensionne la hauteur maximale disponible sur l'iPad.

J'ai essayé de réglage de la hauteur de tous les points de vue dans le xib à hauteur fixe plutôt que souple. J'ai essayé de définir explicitement la hauteur de la liste. J'ai également essayé d'utiliser de vue différents, des contrôleurs de la vue enfant. Le problème demeure: la liste veut redimensionner à hauteur maximum automatiquement chaque fois qu'un nouveau point de vue est poussé à la manette de navigation.

Voici une question qui traite d'essayer délibérément de contrôler la taille de la liste lors de la poussée de nouveaux points de vue:

J'ai pensé que cela pourrait être une force brute de la méthode de contrôle de la taille. Curieusement, même si, en effet, il provoque rapidement quelques bizarreries graphiques (comme si la vue ont été récemment animé), suivie par la poursuite de redimensionner comme décrit ci-dessus.

En d'autres termes, quelque chose est littéralement forcer la liste est à sa hauteur maximale, et il semble se produire après tous délégué méthodes ont été appelés.

Est-ce la manette de navigation? Quelqu'un a vu ce genre de chose?

123voto

borked Points 1351

Cela a résolu le problème après avoir eu le même problème (aujourd'hui également):

EDIT : As contentSizeForViewInPopover est déconseillé en iOS7.0 alors utilisez preferredContentSize .

Réponse originale ci - dessous :

Dans votre detailViewController ajoutez ceci:

 - (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}
 

Vous souhaitez également ajouter quelque chose de similaire à votre DeviceDetailViewController d'origine pour éviter tout redimensionnement lorsque vous tapez sur le NavbarItem précédent.

30voto

Peter DeWeese Points 10185

Tout comme pour le gérer en viewWillAppear , une autre façon de gérer cela consiste à remplacer contentSizeForViewInPopover . Très laconique:

 -(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}
 

30voto

MUH Mobile Inc. Points 683

Pour IOS5

Je vous recommande de le faire dans:

 - (void)viewDidLoad {
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

}
 

11voto

Kurt Points 513

J'ai eu un problème similaire.

J'ai eu une liste actuelle à partir d'un bouton dans une barre d'outils. La liste a été fixée à une taille spécifique. C'était une vue de la table. Lorsque la ligne de la table a été sélectionné, un nouveau point de vue contrôleur avec une manette de navigation a été appelé.

Lorsque le bouton de retour a été sélectionné, la liste est devenue la taille par défaut (320x1100 je crois), au lieu de la taille que je l'ai désiré.

Le code d'origine est:

  MyTableViewController *myVC = [[MyTableViewController alloc] init];
  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  [myVC release];
  [navController release];
  [popover release];

J'ai ajouté une ligne pour résoudre le problème. Accordée il est une sorte de contourner parce que j'ai eu à soustraire la hauteur de l'en-tête. Peut-être que l'un de vous pourrait m'éclairer avec une meilleure méthode. De toute façon, il fonctionne.

  MyTableViewController *myVC = [[MyTableViewController alloc] init];

  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  //Subtract the height of the header to match the total popover size (not just the view).
  myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44);

  [myVC release];
  [navController release];
  [popover release];

Je crois que quand une nav contrôleur est impliqué, et le bouton est pressé, il provoque la liste par défaut à sa taille par défaut. En ajoutant le contentSizeForViewInPopover bien pour la vue-contrôleur myVC, il force la taille spécifique.

Espérons que cela est utile.

Kurt

9voto

Abdullah Umer Points 760

Pour iOS 7, utilisez les éléments suivants:

 - (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}
 

UIViewController.contentSizeForViewInPopover a été déconseillé pour la première fois dans iOS 7.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X