it-swarm.com.de

Benutzerdefinierte Größe für die modulare Ansicht, die mit der Formularblatt-Präsentation geladen wird

Ich versuche, einen UIViewController in Form eines iPad-Formulars zu laden. Das Problem ist die Größe dieser neuen Ansicht. Ich lege die Größenwerte in IBuilder, aber die modale Ansicht nimmt einen festen Wert an.

Ich habe auch versucht, dies in prepareForSegue so zu machen:

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

Aber keine Arbeit, keine Hilfe? Vielen Dank!

34
Fran Fox

Verwenden Sie für iOS 8:

self.preferredContentSize = CGSizeMake(width, height);

Ich habe dies in viewDidLoad gestellt.

Swift 3

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

Überprüfen Sie im Attributinspektor Use Preferred Explicit Size

 enter image description here

15
avdyushin

BEARBEITEN

Verwenden Sie preferredContentSize.

Alt

Sie können dies für die Anzeigenansicht in der Mitte versuchen

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

Die Einstellung von preferredContentSize hat für mich unter iOS 11 nicht funktioniert, wenn Sie beispielsweise EKEventEditViewController präsentieren.

Es funktioniert nur, wenn ich den Getter von preferredContentSize überschreibe. Etwas wie das:

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

Ich habe es wie @Stuart Campbell und @Viruss mca gelöst. 

bearbeitet

Nach @ Erichs Kommentar habe ich ihn für iOS 8 neu geschrieben. Unten ist der 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

Meine Lösung basiert stark auf anderen hier veröffentlichten Lösungen, aber da ich viele verschiedene Dinge ausprobieren musste, damit sie tatsächlich funktioniert, poste ich sie. Meiner ist für iOS 10 mit Swift 3.1 im Hochformat-Modus nur App. (Ungetestet im Querformatmodus) Ziel meiner Lösung war es, eine Modalität anzuzeigen, die kleiner als die Präsentationsansicht war, und so, dass ich die Präsentationsansicht im Hintergrund sehen konnte.

Ich musste den UIViewController richtig im Interface Builder konfigurieren, sonst würde mein Code nicht funktionieren. Hier sind meine Einstellungen. Ich habe meine Lösung gefunden, um mit den Cross Dissolve- und Cover Vertical-Übergangsstilen zu arbeiten. Ich denke, der Schlüssel für mich in IB war der Over Full Screen für die Präsentation - er schien mit einigen anderen Werten für diese Einstellung nicht zu funktionieren.

 IB Settings

Hier ist der Code im UIViewController, den ich modal darstellen möchte. Dann rufe ich es einfach mit present(_:animated:completion:) an anderer Stelle auf. Auch in VC werde ich modal präsentieren, ich habe ein bool, didLayout, das als false initialisiert wurde:

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

Ich bin um dieses Problem herumgekommen, indem ich meinen Inhalt in eine Ansicht in der modalen Vc gestellt habe. Setzen Sie dann den vc-Hintergrund transparent und in viewWillAppear die Einstellungen des Formularbogens transparent. Das heißt, Sie sehen nur den Inhalt.

// In Modal vc
- (void)viewWillAppear:(BOOL)animated
{
    self.view.superview.backgroundColor = [UIColor clearColor];
    [super viewWillAppear:animated];
}

Ich habe alles aus dem Storyboard heraus gesetzt und ein Segment verwendet. Wenn Sie Code verwenden, müssen Sie dies auch festlegen.

parentViewController.modalPresentationStyle = UIModalPresentationPageSheet;
1
Stuart Campbell

Ich hatte auch dieses Problem. Sie sollten den Rahmen von Superview nach der Präsentation in der Größe verändern.

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

Wenn Sie eine Ansicht in XIB verwenden, die als modal präsentierte Ansicht für einen Ansichtscontroller festgelegt ist. Eine sehr einfache Möglichkeit, dies zu beheben, besteht darin, die Größenmetrik einfach in Freiform zu ändern (siehe Abbildung 1.0) und die Ansicht auf die gewünschte Größe anzupassen . Die Ansicht wird mit diesen Metriken angezeigt, wenn sie modal geladen wird.

Das Festlegen der bevorzugten Inhaltsgröße hat in meinem Fall nicht geholfen, aber das hat mein Problem behoben. Es

Abbildung 1.0:

enter image description here

0
Peter Suwara

Erichs Posting funktionierte für mich, aber auf iOS 10 mit Swift 3 musste ich Folgendes verwenden:

self.preferredContentSize = CGSize(width, height)

Ich habe es auch in viewdidload gestellt 

Wie Avdyushin bereits sagte, musste ich das Use Preferred Explicit Size-Kästchen markieren.

0
SomeGuy