2016-05-19 35 views
15

Ich habe Probleme, die Größe meiner Popover-Präsentation zu ändern. Hier ist, was ich bisherSo ändern Sie die Größe eines Popover

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover 
{ 
    if segue.identifier == "popoverView" 
    { 
     let vc = segue.destinationViewController 

     let controller = vc.popoverPresentationController 

     if controller != nil 
     { 
      controller?.delegate = self 
      controller?.sourceView = self.view 
      controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230) 
      controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 
     } 
    } 
} 

Bisher all dies tut, ist Zentrum der popover und entfernen Sie den Pfeil, was gut ist. aber es ändert die Größe des Containers nicht. jede Hilfe würde sehr geschätzt werden. Danke.

wenn ich preferredContentSize verwenden erhalte ich die Fehlermeldung „Kann nicht auf Eigenschaft zuweisen:‚preferredContentSize‘unveränderlich ist“

+0

Warum präsentieren Sie nicht als modales Formular, anstatt zu versuchen, ein Popover in einer Weise zu verwenden, die nicht beabsichtigt ist? – Wain

+0

Mögliches Duplikat von [Wie passe ich mein Popover an die Größe des Inhalts in meiner Tabellenansicht in swift an?] (Http://stackoverflow.com/questions/29449998/how-do-i-adjust-my-popover-to -the-size-of-the-content-in-meiner-tabellenansicht-in-swift) –

+0

sorry, habe ich nicht angegeben. Dies wird für iPhone sein. Laut Apple können Sie ein modales Formularblatt nicht auf dem iPhone neu skalieren, aber Sie können auf einem iPad. Es sei denn, ich lese das falsch. Außerdem habe ich verschiedene Möglichkeiten ausprobiert, um das Popover neu zu skalieren, aber nichts scheint zu funktionieren. Ich bin mir sicher, dass es eine einfache Lösung für den von mir bereitgestellten Code gibt. Ich habe es noch nicht gefunden. – icestorm0806

Antwort

37

der bevorzugte Gehalt Größe auf dem View-Controller-Set nicht das ich popoverPresentationController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover 
    { 
     if segue.identifier == "popoverView" 
     { 
      let vc = segue.destinationViewController 

      vc.preferredContentSize = CGSize(width: 200, height: 300) 

      let controller = vc.popoverPresentationController 

      controller?.delegate = self 
      //you could set the following in your storyboard 
      controller?.sourceView = self.view 
      controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230) 
      controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 

     } 
    } 
5

präsentiert Fixed it via Storyboard: Klicken Sie auf Ihren Controller Klicken Sie auf Attribut Inspektor ViewController> Überprüfen Sie Verwenden Sie bevorzugte explizite Größe und Eingabewerte. Check Image

+1

Während dies die Frage theoretisch beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. – GhostCat

0

Ich verwende keine Storyboards. Ich stelle nur eine UINavigationController im popover:

self.present(popoverNavigationController!, animated: true) {} 

Die Art und Weise der popover Größe, um die Größe, wenn ein neuer View-Controller gedrückt wird, wird nur die preferredContentSize ändern, bevor es schieben. Zum Beispiel:

let newViewController = NewViewController() 
    popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400) 
    popoverNavigationController!.pushViewController(newViewController, animated: true) 

Das Problem ist, wenn wir versuchen, die Größe des Popover zu ändern, wenn wir einen View-Controller aufrufen.

Wenn Sie viewWillDisappear des aktuellen Ansichtscontrollers verwenden, um die preferredContentSize des Popover zu ändern, wird die Größe des Popover geändert, aber nach dem Aufruf des Ansichtscontrollers. Das bedeutet, dass die Animation eine Verzögerung hat.

Sie müssen die preferredContentSize vor dem Ausführen von popViewController ändern. Das bedeutet, dass Sie in der Navigationsleiste einen benutzerdefinierten Zurück-Button erstellen müssen, so wie es erklärt wird here. Dies ist die Implementierung für Swift aktualisiert 4:

 self.navigationItem.hidesBackButton = true 
     let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))  
     self.navigationItem.leftBarButtonItem = newBackButton 

Und den nächsten Code ausgeführt werden, wenn die neue Zurück-Taste gedrückt wird:

@objc func backButtonTapped(sender: UIBarButtonItem) { 

     self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200) 

     self.navigationController?.popViewController(animated: true) 
    } 

Grundsätzlich hat die preferredContentSize vor Schiebe- und knallen die Ansicht geändert werden Regler.

Verwandte Themen