web-dev-qa-db-fra.com

Comment redimensionner une fiche UIModalPresentationForm?

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

44
Sheehan Alam

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];
}
91
Brody Robertson

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);
    }
}
13
psy

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

12
Skullhouseapps

À partir de iOS7, vous pouvez simplement faire 

composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);
8
Ed Filowat

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);
}
4
Chathurka

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

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:

  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'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.

4
Jon

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:

  1. présenter le contrôleur de vue (mode de présentation: UIModalPresentationFormSheet)
  2. définir la couleur d'arrière-plan de Superview Controller pour effacer
  3. changez le contrôleur de vue à votre guise (peut-être en le rendant plus petit et en le centrant ensuite dans l'aperçu)
3
Spencer Hall

@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.

2
Oliver Michalak

J'ai eu une vue modale plein écran de UIPresentationFormSheet avec juste cette ligne:

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

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;
    }
0
Anand Mishra