2015-03-18 7 views
9

Ich möchte ein kleines Popover über 50x50px von einem UIButton erstellen. Ich habe Methoden gesehen, die adaptive segues verwenden, aber ich habe meine Größenklassen von Bedeutung, also kann ich diese Funktionen nicht verwenden!Erstellen eines Popover von einem UIButton in Swift

Wie sonst kann ich dieses Popover erstellen? Kann ich es mit Code in meiner Taste IBACtion erstellen? Oder gibt es noch einen Weg, wie ich das mit Storyboards machen kann?

Antwort

9

Sie können eine der folgenden zwei Optionen tun:

  • Eine Aktion für die UIButton in Ihrem UIViewController und innen präsentieren die ViewController Sie wie ein Popover wollen und Ihre UIViewController das Protokoll UIPopoverPresentationControllerDelegate zu implementieren hat, werfen Sie einen Blick in den folgenden Code:

    @IBAction func showPopover(sender: AnyObject) { 
    
        var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardIdentifier") as! UIViewController 
    
        popoverContent.modalPresentationStyle = .Popover 
        var popover = popoverContent.popoverPresentationController 
    
        if let popover = popoverContent.popoverPresentationController { 
    
         let viewForSource = sender as! UIView 
         popover.sourceView = viewForSource 
    
         // the position of the popover where it's showed 
         popover.sourceRect = viewForSource.bounds 
    
         // the size you want to display 
         popoverContent.preferredContentSize = CGSizeMake(200,500) 
         popover.delegate = self 
        }    
    
        self.presentViewController(popoverContent, animated: true, completion: nil) 
    } 
    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
        return .None 
    } 
    

    nach dem Buch von @ Matt Programming iOS 8:

    A popover Präsentationssteuerung in IOS 8 ist eine Präsentationssteuerung (UIPresentationController) und Präsentations Controller adaptiv sind. Dies bedeutet, dass der modale Präsentationsstil in einer horizontal kompakten Umgebung (d. H. Auf einem iPhone) standardmäßig als .FullScreen behandelt wird. Was als Popover auf dem iPad erscheint, erscheint als Vollbildansicht auf dem iPhone und ersetzt die Benutzeroberfläche vollständig.

    Um dieses Verhalten in der iPhone vermeiden Sie die delegierte Methode adaptivePresentationStyleForPresentationController in Ihrem UIViewController implementieren müssen korrekt Popover angezeigt werden soll.

  • Der andere Weg, meiner Meinung nach ist leichter, zu tun und ist mit Interface Builder, ordnen nur vom UIButton eine segue zum ViewController Sie erstellen möchten und in der Segue wählen Sie die Popover segue.

Ich hoffe, das hilft Ihnen.

+0

Danke dafür! Das erste Beispiel funktioniert, aber es scheint die Größe nicht zu verändern. Das Popover erscheint nur im Vollbildmodus. Ich denke, die zweite Art, die Sie erklärt, wäre ein besserer Weg .. Aber noch einmal bekomme ich einen Fehler konnte nicht Verbindung IBCoaTouchoutlet Anker Ansicht zu entsprechen. Könnten Sie mir einen Code geben, der mit der von Ihnen erklärten zweiten Möglichkeit übereinstimmt? – user4671001

+0

@ user4671001 Ich verstehe nicht, in der zweiten Weise müssen Sie nicht die AnchoView für nichts festlegen –

+2

Popover zeigt als Vollbildmodus auf iPhones, können Sie dies deaktivieren, indem Sie diese Funktion hinzufügen: 'func adaptivePresentationStyleForPresentationController (PC: UIPresentationController!) > UIModalPresentationStyle { // Dies * erzwingt * ein Popover, das auf dem iPhone angezeigt wird Rückkehr .Keine } ' – user1076813

1

Hier können Sie ein Popover auf Knopfdruck darstellen.

func addCategory(_ sender : UIButton) { 

     var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController 
     var nav = UINavigationController(rootViewController: popoverContent) 
     nav.modalPresentationStyle = UIModalPresentationStyle.Popover 
     var popover = nav.popoverPresentationController 
     popoverContent.preferredContentSize = CGSizeMake(50,50) 
     popover.delegate = self 
     popover.sourceView = sender 
     popover.sourceRect = sender.bounds 

     self.presentViewController(nav, animated: true, completion: nil) 

    } 
0

Swift 4 hier voll arbeitet Code.

import UIKit 

    class ViewController: UIViewController { 

     @IBOutlet weak var button: UIButton! 

     override func viewDidLoad() { 
      super.viewDidLoad() 

// in case if you don't want to make it via IBAction 
      button.addTarget(self, action: #selector(tapped), for: .touchUpInside) 
     } 

     @objc 
     private func tapped() { 

      guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") else { return } 

      popVC.modalPresentationStyle = .popover 

      let popOverVC = popVC.popoverPresentationController 
      popOverVC?.delegate = self 
      popOverVC?.sourceView = self.button 
      popOverVC?.sourceRect = CGRect(x: self.button.bounds.midX, y: self.button.bounds.minY, width: 0, height: 0) 
      popVC.preferredContentSize = CGSize(width: 250, height: 250) 

      self.present(popVC, animated: true) 
     } 
    } 


// This is we need to make it looks as a popup window on iPhone 
    extension ViewController: UIPopoverPresentationControllerDelegate { 

     func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
      return .none 
     } 
    } 

Nehmen Sie in der Aufmerksamkeit, die Sie popVC Kennung eines Viewcontroller Sie präsentieren als Popup zu bieten haben: So, hier werden Sie Popup-Fenster mit einer Größe von 250x250 zu sehen.

Hoffe, dass hilft!