Taille sur mesure pour la vue modale chargée avec la présentation de la feuille de formulaire

j'essaie de charger un UIViewController dans iPad avec la présentation de la feuille de forme. Le problème est la taille de cette nouvelle vue, j'ai mis les valeurs de taille dans L'IBuilder mais la vue modale prendre une valeur fixe.

J'ai aussi essayé de faire ceci dans prepareForSegue comme ceci:

HelpViewController *viewController = segue.destinationViewController;
viewController.view.superview.frame = CGRectMake(0, 0, 200, 200);

mais ne travaille pas, de l'aide? Merci!

29
demandé sur Fran Fox 2013-05-13 12:56:12

9 réponses

pour iOS 8, utiliser:

self.preferredContentSize = CGSizeMake(width, height);

j'ai placé ce dans viewDidLoad.

Swift 3

self.preferredContentSize = CGSize(width: 100, height: 100)
68
répondu Erich 2017-07-19 08:33:35

dans les attributs inspecteur check Use Preferred Explicit Size

enter image description here

13
répondu avdyushin 2016-07-13 13:06:08

EDIT

Utiliser preferredContentSize.

Vieux

Vous pouvez essayer ce pour afficher la vue dans le 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;
}];
7
répondu Toseef Khilji 2018-04-24 04:26:04

preferredContentSize n'a pas fonctionné pour moi sur iOS 11 par exemple lors de la présentation EKEventEditViewController.

cela ne fonctionne que si j'annule getter de preferredContentSize. Quelque chose comme ceci:

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
        }
    }
}

enter image description here enter image description here

3
répondu Gleb Tarasov 2017-10-05 20:29:13

Je l'ai résolu comme @ Stuart Campbell et @Viruss mca.

Modifié

après le commentaire DE @Erich, Je l'ai réécrit pour courir dans 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;
}
2
répondu orafaelreis 2014-11-25 13:37:39

j'ai contourné ce problème en plaçant mon contenu dans une vue dans le vc modal. Ensuite, définir le fond vc transparent et dans les paramètres viewWillAppear le fond formsheet transparent. 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 paramétré à partir de storyboard et j'ai utilisé une séquence, si j'utilise du code, vous devez aussi paramétrer cela.

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
1
répondu Stuart Campbell 2013-12-18 11:14:56

ma solution est fortement basée sur d'autres solutions postées ici mais comme j'ai dû essayer beaucoup de choses différentes pour la faire fonctionner, je l'affiche. Le mien est pour iOS 10 avec Swift 3.1 dans une application en mode portrait seulement. (Non testé en mode paysage) le but de ma solution était d'afficher un modal plus petit que la vue de présentation, et de sorte que je puisse voir la vue de présentation en arrière-plan.

j'ai dû configurer le UIViewController correctement dans Interface Builder ou mon code ne marcherait pas. Voici mes paramètres. J'ai trouvé ma solution pour travailler avec les deux Cross Dissolve et Cover Vertical styles de transition. Je pense que pour moi, l'essentiel de l'IB a été l' Over Full Screen pour la Présentation - il ne semble pas fonctionner avec certains autres valeurs pour ce paramètre.

IB Settings

voici le code dans le UIViewController que je veux présenter modalement. Alors j'appelle ça utiliser present(_:animated:completion:) ailleurs. En outre, dans la CV je vais présenter modalement, j'ai un bool,didLayout initialisé 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
        }
    }
1
répondu Jacob Davis 2017-06-27 17:55:26

j'ai aussi 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);
0
répondu Santh0sh 2013-08-14 06:44:18

le post D'Erich a fonctionné pour moi, mais sur iOS 10 avec Swift 3, j'ai dû utiliser:

self.preferredContentSize = CGSize(width, height)

j'ai aussi placé dans viewdidload

aussi, comme avdyushin a dit, j'ai dû vérifier le Use Preferred Explicit Size boîte.

0
répondu SomeGuy 2017-01-15 14:10:55