54 votes

iPad taille personnalisée du contrôleur de vue modale

J'ai un couple de modal vue contrôleurs de certaine taille. J'essaie d'éviter l'utilisation de vues personnalisées (création en plein écran noir translucide superposition sur affichage actuel, ajouter la modale de vue sur ce point de vue, ne les animations, etc) pour le présenter car il n'est pas modalPresentationStyle qui s'adapte à la taille de mes contrôleurs.

Maintenant, je suis en utilisant UIModalPresentationPageSheet mais de mon point de vue est plus petit en hauteur et j'ai une vilaine espace vide

Présentation souhaitée

 _______________
|    _______    |
|   |       |   |
|   |  MyVC |   |
|   |       |   |
|    -------    |
 --------------- 

Présentation

 _______________
|   |       |   |
|   |  MyVC |   |
|   |       |   |
|   |-------|   |
|   | blank |   |
 ---------------    

Si j'utilise le UIModalPresentationFormSheet le conteneur est plus petit en largeur.

Je suis à essayer de comprendre comment faire, mais je ne sais pas si c'est possible. Quelle est la solution au problème de la présentation d'un modal VC plus petit que n'importe quel presentationStyles? La seule solution est d'organiser une "custom modal-vue-contrôleur de moteur"? Popovers ne convient pas à mes exigences de conception :(

84voto

Lensflare Points 650

En tant qu'autres utilisateurs ici, j'ai également eu le problème que l'origine du contrôleur de vue modale n'était pas correcte. Après quelques expériences, j'ai trouvé une solution qui a fonctionné pour moi:

 - (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];   
    self.view.superview.bounds = CGRectMake(0, 0, <width>, <height>);
}
 

35voto

marcio Points 2397

J'ai obtenu le résultat suivant ( texte du lien ) en utilisant:

 self.modalPresentationStyle = UIModalPresentationFormSheet;
 

et en le présentant comme un contrôleur de vue modale. Faites-moi savoir si vous avez besoin d'aide supplémentaire.

24voto

pawel_d Points 186

Toutes ces réponses ne fonctionneront pas sur le SDK ios8.

Cela fonctionnera:

 AboutViewController * _aboutViewController = [[AboutViewController alloc] init];
    _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet;
    if(IS_IOS8)
    {
        _aboutViewController.preferredContentSize = CGSizeMake(300, 300);
    }
    [self presentViewController:_aboutViewController animated:YES completion:nil];
 

Dans AboutViewController.m

 - (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    if(!IS_IOS8)
    {
        self.view.superview.bounds = CGRectMake(0, 0, 300, 300);
    }
}
 

IS_IOS8

 #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)
 

Dans iOS 8, vous pouvez également utiliser UIPresentationController, qui vous donne davantage d'options de personnalisation.

19voto

Brenden Points 2320

J'ai eu un problème à obtenir la taille personnalisée modal vers le centre jusqu'à ce que j'ai compris ce ViewController.view.superview.frame a été fixé initialement. Il est déterminé en fonction de la UIModalPresentation type. superview.center n'est même pas nécessaire(dans la mesure de mes tests).

Aussi, j'ai mis les coordonnées de manière dynamique à l'aide de [UIScreen mainScreen].applicationFrame, seulement soutenir l'orientation paysage pour l'instant. Que vous avez à faire un contrôle conditionnel pour soutenir à la fois portrait et paysage en basculant le X/Y et la Hauteur/Largeur de valeurs.

C'était ma première solution de travail pour iOS 6.0:

ViewController.modalPresentationStyle = UIModalPresentationFormSheet;
ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:ViewController animated:YES completion:nil];
ViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
ViewController.view.superview.frame = CGRectMake(
                                                                    // Calcuation based on landscape orientation (width=height) 
                                                                    ([UIScreen mainScreen].applicationFrame.size.height/2)-(320/2),// X
                                                                    ([UIScreen mainScreen].applicationFrame.size.width/2)-(320/2),// Y
                                                                    320,// Width
                                                                    320// Height
                                                                    );

Et puis j'ai regardé à la réponse précédente et tapisse la face. Raccourcit ma solution un peu en remplaçant la dernière ligne avec:

ViewController.view.superview.bounds = CGRectMake(0, 0, 320, 320);

EDIT pour la solution finale et remarques.

18voto

Rob Jones Points 2801

La meilleure façon de le faire est de modifier les limites de la propriété sur le superview de la vue à l'intérieur de la formsheet. Lorsque vous présentez un point de vue modal, la vue est incorporé à l'intérieur d'un autre point de vue.

Vous devez définir les limites de la propriété de la superview à la même rect comme le point de vue de limites. Tout d'abord ajouter un privé ivar dans votre classe:

@implementation MySpecialFormsheet {
    CGRect _realBounds;
} 

Il est préférable de le faire dans viewWillAppear:. Ajoutez le code suivant à la vue-contrôleur, qui est présenté sous forme modale:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.view.superview.bounds = _realBounds;
}

Vous avez besoin de cache _realBounds votre viewDidLoad méthode:

- (void)viewDidLoad {
    _realBounds = self.view.bounds;
    [super viewDidLoad];
}

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