J'essaie d'afficher un contrôleur de vue modale en tant que UIPresentationFormSheet. La vue apparaît, mais je n'arrive pas à la redimensionner. Mon XIB a la bonne hauteur et largeur, mais il semble avoir été remplacé quand 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);
Après le premier code, comment présenter votre contrôleur de vue 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ôleurs ComposeTweet
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.view.superview.frame = CGRectMake(0, 0,500,400);
}
Cela fonctionnera avec n’importe quelle 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;
}
Testé et fonctionne pour iOS 6, en utilisant XCode 4.5
Je suis tombé sur ma réponse après avoir lu beaucoup des astuces ici:
Dans la méthode viewWillAppear:(BOOL)animated
:
[super viewWillAppear:animated];
//resize modal view
self.view.superview.bounds = CGRectMake(0, 0, 432, 680);
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'ajouter le code de centrage au même endroit que le code de redimensionnement, mais cela n'a pas fonctionné. Pour une raison quelconque, cela ne fonctionne que lorsque la vue est apparue à l'écran.
Je suppose que cela a quelque chose à voir avec la façon dont fonctionne UIModalPresentationFormSheet, car lorsque je parcourais le débogueur LLDB, j'ai remarqué qu'il y avait une variable _formSheetSize qui était toujours {540, 620}. Allez comprendre.
IOS 7
Donc, l'approche consistant à définir le cadre ou les limites de superview ne fonctionne plus sous iOS 7 (pour UIModalTransitionStyleCoverVertical). Cependant, vous pouvez maintenant 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 vue modale comme bon vous semble.
Donc, dans iOS 7, vous voudrez:
@bdrobert malheureusement, votre solution Nice ne fonctionne plus sur iOS6 - le conteneur conserve la taille d'origine même si le nouveau contrôleur de vue est intégré à la taille personnalisée.
Vous devez probablement utiliser l'API de confinement introduite dans iOS5 , mais vous devez ajouter vous-même un arrière-plan estompé, récupérant tous les événements tactiles de cette zone.
J'ai eu une vue modale plein écran de UIPresentationFormSheet
avec juste cette ligne:
modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748);
Au 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;
}