web-dev-qa-db-fra.com

Taille personnalisée pour la vue modale chargée avec une présentation de feuille de formulaire

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!

34
Fran Fox

Pour iOS 8, utilisez:

self.preferredContentSize = CGSizeMake(width, height);

J'ai placé ceci dans viewDidLoad.

Swift 3

self.preferredContentSize = CGSize(width: 100, height: 100)
71
Erich

Dans l'inspecteur d'attributs, contrôlez Use Preferred Explicit Size

 enter image description here

15
avdyushin

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;
}];
7
Toseef Khilji

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

 enter image description here  enter image description here

4
Gleb Tarasov

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;
}
2
orafaelreis

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.

 IB Settings

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
        }
    }
2
Jacob Davis

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;
1
Stuart Campbell

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

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.

0
SomeGuy