Comment redimensionner une UIModalPresentationFormSheet?

J’essaie d’afficher un contrôleur de vue modal en tant que UIPresentationFormSheet. La vue apparaît, mais je n’arrive pas à la redimensionner. Mon XIB a la hauteur et la largeur appropriées, mais il semble être remplacé lorsque je l’appelle comme ceci:

composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil]; composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet; [self presentModalViewController:composeTweetController animated:TRUE]; 

Des pensées? J’utilise l’iPhone SDK 3.2 beta 4

Vous pouvez ajuster le cadre d’une vue modale après l’avoir présenté:

Testé sous iOS 5.1 – 7.1

 MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease]; targetController.modalPresentationStyle = UIModalPresentationFormSheet; targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; //transition shouldn't matter [self presentViewController:targetController animated:YES completion:nil]; if(floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){ targetController.view.superview.frame = CGRectInset(targetController.view.superview.frame, 100, 50); }else{ targetController.view.frame = CGRectInset(targetController.view.frame, 100, 50); targetController.view.superview.backgroundColor = [UIColor clearColor]; } 

Voici une méthode qui fonctionne sur iOS7 ainsi que sur iOS5 et iOS6: (arc)

 -(void)presentController:(UIViewController*)controller fromRootController:(UIViewController*)rootController withSize:(CGSize)size { UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller]; nav.modalTransitionStyle = UIModalTransitionStyleCoverVertical; nav.modalPresentationStyle = UIModalPresentationFormSheet; [rootController presentModalViewController:nav animated:YES]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { nav.view.superview.backgroundColor = [UIColor clearColor]; nav.view.bounds = CGRectMake(0, 0, size.width, size.height); } else { nav.view.superview.bounds = CGRectMake(0, 0, size.width, size.height); } } 

 composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil]; composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet; [self presentModalViewController:composeTweetController animated:TRUE]; //if you want to change its size but the view will remain centerd on the screen in both portrait and landscape then: composeTweetViewController.view.superview.bounds = CGRectMake(0, 0, 320, 480); //or if you want to change it's position also, then: composeTweetViewController.view.superview.frame = CGRectMake(0, 0, 320, 480); 

À partir de iOS7, vous pouvez simplement faire

 composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0); 

Testé et fonctionne pour iOS 6, en utilisant XCode 4.5

Je suis tombé sur ma réponse après avoir lu une grande partie des conseils ici:

  1. Dans la méthode viewWillAppear:(BOOL)animated :

     [super viewWillAppear:animated]; //resize modal view self.view.superview.bounds = CGRectMake(0, 0, 432, 680); 
  2. Dans la méthode viewDidAppear:(BOOL)animated :

     CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2); self.view.superview.center = centerPoint; 

J’ai essayé d’append le code de centrage au même endroit que le code de redimensionnement, mais cela n’a pas fonctionné. Pour une raison quelconque, il ne fonctionne que lorsque la vue est apparue à l’écran.

Je suppose que cela a quelque chose à voir avec la manière dont fonctionne UIModalPresentationFormSheet, car lorsque je passais en revue le débogueur LLDB, j’ai remarqué qu’il y avait une variable _formSheetSize qui était toujours {540, 620}. Allez comprendre.

Cela fonctionnera avec tout UIModalTransitionStyle

 @interface BaseDialog () @property(nonatomic,assign) CGRect origFrame; @end @implementation BaseDialog -(void)viewDidLoad{ [super viewDidLoad]; self.origFrame=self.view.frame; } -(CGSize)formSheetSize{ return self.origFrame.size; } 

Le premier code suivant explique comment présenter votre contrôleur de vue de modèle

  composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil]; composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:composeTweetController]; navigationController.delegate = self; [self presentModalViewController:navigationController animated:YES]; 

Et dans votre classe de contrôleur ComposeTweet

 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.view.superview.frame = CGRectMake(0, 0,500,400); } 

IOS 7

Donc, l’approche consistant à définir le cadre ou les limites de la superview ne fonctionne plus sur iOS 7 (pour UIModalTransitionStyleCoverVertical). Vous pouvez toutefois définir la couleur d’arrière-plan de la vue d’ensemble pour qu’elle disparaisse, puis modifier le cadre du contrôleur de la vue modale comme bon vous semble.

Donc, dans iOS 7, vous voudrez:

  1. présenter le contrôleur de vue (mode de présentation: UIModalPresentationFormSheet)
  2. définir la couleur d’arrière-plan de la vue d’ensemble du contrôleur de vue pour effacer
  3. changer le contrôleur de vue comme vous le souhaitez (peut-être le rendre plus petit et le centrer dans la superview)

J’ai obtenu une vue modale en plein écran depuis UIPresentationFormSheet avec cette ligne:

 modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748); 

@bdrobert malheureusement votre belle solution ne fonctionne plus sur iOS6 – le conteneur conserve la taille d’origine même si le nouveau viewcontroller est intégré à la taille personnalisée.

Vous devez probablement utiliser l’API de confinement introduite dans iOS5 , mais vous devez append vous-même un arrière-plan grisé, en récupérant tous les événements tactiles pour cette zone.

En cas de changement d’orientation, ce code fonctionne parfaitement ….

settingViewController.modalPresentationStyle = UIModalPresentationFormSheet;

  [self presentViewController:settingViewController animated:YES completion:nil]; settingViewController.view.superview.frame = CGRectMake(0, 0, 700, 700); UIInterfaceOrientation currentOrientation = [self getDeviceOrientation]; if(currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown) { CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2); settingViewController.view.superview.center = centerPoint; } else { CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.height/2, [[UIScreen mainScreen] bounds].size.width/2); settingViewController.view.superview.center = centerPoint; } 

La taille de la vue est fixe. Vous devrez mettre en œuvre les choses vous-même si vous voulez quelque chose de différent.