J'essaie de charger un UIViewController sur iPad avec une présentation de feuille de formulaire. Le problème est la taille de cette nouvelle vue, je mets les valeurs de taille dans IBuilder mais la vue modale prend une valeur fixe.
Aussi, j'ai essayé de faire cela dans prepareForSegue comme ceci:
HelpViewController *viewController = segue.destinationViewController;
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
Mais ça ne marche pas, aucune aide? Merci!
Pour iOS 8, utilisez:
self.preferredContentSize = CGSizeMake(width, height);
J'ai placé ceci dans viewDidLoad
.
self.preferredContentSize = CGSize(width: 100, height: 100)
MODIFIER
Utilisez preferredContentSize
.
Vieux
Vous pouvez essayer ceci pour voir la vue au centre
HelpViewController * viewController = [[[HelpViewController alloc] init] autorelease];
viewController.modalPresentationStyle=UIModalPresentationFormSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:viewController animated:YES completion:^{
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
viewController.view.superview.center = self.view.center;
}];
La définition de preferredContentSize
ne fonctionnait pas pour moi sur iOS 11, par exemple lors de la présentation de EKEventEditViewController
.
Cela ne fonctionne que si je remplace le getter de preferredContentSize
. Quelque chose comme ça:
private class CLEventEditViewController: EKEventEditViewController {
override var preferredContentSize: CGSize {
get {
if let fullSize = self.presentingViewController?.view.bounds.size {
return CGSize(width: fullSize.width * 0.5,
height: fullSize.height * 0.75)
}
return super.preferredContentSize
}
set {
super.preferredContentSize = newValue
}
}
}
Je l'ai résolu comme @Stuart Campbell et @Viruss mca.
Edité
Après le commentaire de @ Erich, je l'ai réécrit pour fonctionner sous iOS 8 aussi. Ci-dessous le code:
HelpViewController * viewController = [[[HelpViewController alloc] init]];
viewController.modalPresentationStyle=UIModalPresentationFormSheet;
[self presentViewController:viewController animated:YES completion:nil];
-
//HelpViewController.m
- (void) viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
if (!didLayout) {
[self layout];
didLayout = YES;
}
}
- (void) layout{
self.view.superview.backgroundColor = [UIColor clearColor];
CGRect screen = self.view.superview.bounds;
CGRect frame = CGRectMake(0, 0, <width>, <height>);
float x = (screen.size.width - frame.size.width)*.5f;
float y = (screen.size.height - frame.size.height)*.5f;
frame = CGRectMake(x, y, frame.size.width, frame.size.height);
self.view.frame = frame;
}
Ma solution est fortement basée sur les autres solutions publiées ici, mais comme je devais essayer beaucoup de choses différentes pour la faire fonctionner, je la publie. Mine est pour iOS 10 avec Swift 3.1 dans une application en mode portrait uniquement. (Non testé en mode paysage) Le but de ma solution était d'afficher un mode modal plus petit que la vue de présentation et permettant de voir la vue de présentation en arrière-plan.
Je devais configurer UIViewController correctement dans Interface Builder ou mon code ne fonctionnerait pas. Voici mes paramètres. J'ai trouvé que ma solution fonctionnait à la fois avec les styles de transition Cross Dissolve
et Cover Vertical
. Je pense que la clé pour moi dans IB était le Over Full Screen
pour Presentation - cela ne semblait pas fonctionner avec d'autres valeurs pour ce paramètre.
Voici le code dans le UIViewController que je veux présenter de manière modale. Ensuite, je l’appelle simplement en utilisant present(_:animated:completion:)
ailleurs. De plus, dans le VC, je présenterai de manière modale le fait que j’ai un bool, didLayout
initialisé avec false
:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if !didLayout {
let width:CGFloat = self.view.bounds.width * 0.95 //modify this constant to change the amount of the screen occupied by the modal
let height:CGFloat = width * 1.618 //golden ratio
self.view.superview!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.15) //slightly dim the background to focus on the modal
let screen = self.view.superview!.bounds
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let x = (screen.size.width - frame.size.width) * 0.5
let y = (screen.size.height - frame.size.height) * 0.5
let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height)
self.view.frame = mainFrame
didLayout = true
}
}
J'ai contourné ce problème en mettant mon contenu dans une vue du modal vc. Puis définissez l’arrière-plan vc transparent et, dans les paramètres viewWillAppear, l’arrière-plan transparent de la feuille de calcul. Cela signifie que vous ne voyez que le contenu.
// In Modal vc
- (void)viewWillAppear:(BOOL)animated
{
self.view.superview.backgroundColor = [UIColor clearColor];
[super viewWillAppear:animated];
}
J'ai tout réglé à partir du storyboard et utilisé une transition. Si vous utilisez du code, vous devez également le définir.
parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
J'ai également eu ce problème, vous devriez redimensionner le cadre de Superview après l'avoir présenté.
HelpViewController *viewController = segue.destinationViewController;
viewController.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController:viewController animated:YES completion:nil];
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);
Le message d'Erich a fonctionné pour moi, mais sur iOS 10 avec Swift 3, je devais utiliser:
self.preferredContentSize = CGSize(width, height)
Moi aussi je l'ai placé dans viewdidload
En outre, comme avdyushin l’a dit, je devais cocher la case Use Preferred Explicit Size
.