45 votes

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 bonne hauteur et largeur, mais il semble avoir été 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

91voto

Brody Robertson Points 3197

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.superview.frame, 100, 50);
}
 

13voto

psy Points 1522

Voici une méthode qui fonctionne sur iOS7 ainsi que 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);
    }
}
 

12voto

Skullhouseapps Points 303

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

4voto

Jon Points 2102

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

Je suis tombé sur ma réponse après avoir lu beaucoup de conseils ici:

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

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

    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 centrage code au même endroit que le redimensionnement de code, mais cela ne fonctionne pas. Pour une raison quelconque, il ne fonctionne qu'une fois que la vue est apparu sur l'écran.

J'ai supposer qu'il a quelque chose à voir avec la façon dont UIModalPresentationFormSheet œuvres, parce que quand je mettais les pieds de travers dans le LLDB débogueur, j'ai remarqué qu'il y avait une variable _formSheetSize qui était encore {540, 620}. Aller à la figure.

4voto

john07 Points 41

Cela fonctionnera avec n'importe quel 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;
}
 

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