¿Cómo cambiar el tamaño de UIModalPresentationFormSheet?

Estoy intentando mostrar un controlador de vista modal como UIPresentationFormSheet. La vista aparece, pero parece que no puedo redimensionarla. Mi XIB tiene el alto y el ancho adecuados, pero parece anulado cuando lo llamo así:

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

¿Alguna idea? Estoy usando el iPhone SDK 3.2 beta 4

Puede ajustar el marco de una vista modal después de presentarlo:

Probado en 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]; } 

Aquí hay un método que funciona en iOS7 , iOS5 e iOS6: (arco)

 -(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); 

A partir de iOS7 puedes simplemente hacer

 composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0); 

Probado y funciona para iOS 6, utilizando XCode 4.5

Me encontré con mi respuesta después de leer muchos de los consejos aquí:

  1. En el método viewWillAppear:(BOOL)animated :

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

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

Traté de agregar el código de centrado en el mismo lugar que el código de cambio de tamaño, pero eso no funcionó. Por alguna razón, solo funciona después de que la vista haya aparecido en la pantalla.

Supongo que tiene algo que ver con la forma en que funciona UIModalPresentationFormSheet, porque cuando estaba avanzando en el depurador LLDB, noté que había una variable _formSheetSize que todavía era {540, 620}. Imagínate.

Esto funcionará con cualquier 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; } 

El primer código es cómo presentar su controlador de vista modelo

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

Y en tu clase de controlador ComposeTweet

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

ios 7

Así que el enfoque de establecer el marco o límites de la supervista ya no funciona en iOS 7 (para UIModalTransitionStyleCoverVertical). Sin embargo, ahora puede configurar el color de fondo de la supervista para borrar y luego cambiar el marco del controlador de vista modal como mejor le parezca.

Entonces en iOS 7 querrás:

  1. presentar el controlador de vista (modo de presentación: UIModalPresentationFormSheet)
  2. establecer el color de fondo de la vista superior del controlador de vista para borrar
  3. cambie el controlador del marco de visión como desee (tal vez haciéndolo más pequeño y luego centrándolo en supervista)

UIPresentationFormSheet vista modal de pantalla completa de UIPresentationFormSheet con solo esta línea:

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

@bdrobert lamentablemente su buena solución ya no funciona en iOS6 : el contenedor conserva el tamaño original aunque el nuevo controlador de vista esté incrustado con el tamaño personalizado.

Probablemente necesites usar la API de contención presentada en iOS5 , pero necesitas agregar un fondo atenuado por tu cuenta, buscando todos los eventos táctiles para esa área.

En cambio de orientación, este código funciona perfecto …

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

El tamaño de la vista es fijo. Tendrá que implementar las cosas usted mismo si quiere algo diferente.