2015-03-18 9 views
9

Desidero creare un piccolo popover su 50x50px da un UIButton. Ho visto metodi che utilizzano i seguicamme adattativi, ma ho il mio turno di classi di dimensioni che significa che non posso usare queste caratteristiche!Creazione di un popover da un UIButton in Swift

In quale altro modo posso creare questo popover? Posso crearlo con il codice all'interno del mio pulsante IBACtion? O c'è ancora un modo per farlo con gli storyboard?

risposta

9

È possibile effettuare una delle due seguenti opzioni:

  • creare un'azione per la UIButton nel vostro UIViewController e dentro presentare il ViewController si vuole come un Popover e la tua UIViewController deve implementare il protocollo UIPopoverPresentationControllerDelegate, date un'occhiata nel codice seguente:

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

    Secondo il libro di @ Matt Programmazione iOS 8:

    Un controllore presentazione popover, in iOS 8, è un controller di presentazione (UIPresentationController), e controllori di presentazione sono adattivo. Ciò significa che, per impostazione predefinita, in un ambiente orizzontale compatto (ad esempio su un iPhone), lo stile di presentazione modale verrà considerato come .FullScreen. Quello che appare come un popover sull'iPad apparirà come una vista a schermo intero presentata sull'iPhone, sostituendo completamente l'interfaccia.

    Per evitare questo comportamento in iPhone è necessario implementare il metodo delegato adaptivePresentationStyleForPresentationController all'interno del vostro UIViewController per visualizzare correttamente la Popover.

  • L'altro modo, a mio parere è più facile da fare, e sta usando Interface Builder, basta organizzare dal UIButton per creare un segue al ViewController che si desidera e nel selezionare la segue Popover segue.

Spero che questo ti aiuti.

+0

Grazie per questo! Il primo esempio funziona, ma sembra che non sia la dimensione. Il popover appare a schermo intero. Penso che il secondo modo in cui hai spiegato sarebbe un modo migliore .. Ma ancora una volta ho ricevuto un errore non potendo rispettare la connessione di ancoraggio IBCocoaTouchoutlet View. Potresti darmi un codice che corrisponda al secondo modo in cui hai spiegato? – user4671001

+0

@ user4671001 Non capisco, in secondo luogo non è necessario impostare l'anchoView per nulla –

+2

popover si presenta come modal a schermo intero su iPhone, è possibile disabilitare questo aggiungendo questa funzione: 'func adaptivePresentationStyleForPresentationController (PC: UIPresentationController!) - > UIModalPresentationStyle { // Questo * impone * la visualizzazione di un popover su iPhone return .Nessuno } ' – user1076813

1

Qui è possibile presentare un popover sul clic del pulsante.

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 Qui è completamente codice di lavoro. Così qui si vedrà finestra pop-up con dimensioni di 250x250:

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

tener attenzione che è necessario fornire identificatore popVC a uno viewController si vuole presentare come un popup.

Spero che questo aiuti!

Problemi correlati