2015-04-04 11 views
18

Ich benutze popoverPresentationController, um mein Popover zu zeigen. Die als Popover angezeigte UITableViewController wird programmgesteuert erstellt und enthält normalerweise 1 bis 5 Zeilen. Wie richte ich dieses Popover ein, um die Größe an den Inhalt der Tabellenansicht anzupassen?Wie stelle ich mein Popover schnell auf die Größe des Inhalts in meiner Tabellenansicht ein?

-Code für meinen popover:

if recognizer.state == .Began { 
    let translation = recognizer.locationInView(view) 

    // Create popoverViewController 
    var popoverViewController = UITableViewController() 
    popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover 
    popoverViewController.tableView.backgroundColor = UIColor.popupColor() 

    // Settings for the popover 
    let popover = popoverViewController.popoverPresentationController! 
    popover.delegate = self 
    popover.sourceView = self.view 
    popover.sourceRect = CGRect(x: translation.x, y: translation.y, width: 0, height: 0) 
    popover.backgroundColor = UIColor.popupColor() 

    presentViewController(popoverViewController, animated: true, completion: nil) 
} 

Antwort

20

Kasse des preferredContentSize property of UIViewController:

let height = yourDataArray.count * Int(popOverViewController.tableView.rowHeight) 
popOverViewController.preferredContentSize = CGSize(width: 300, height: height) 
+0

Dank, ganz simpel. Ich habe 'preferredContentSize' vorher versucht, aber nicht daran gedacht, die Anzahl meiner Arrays zu verwenden: o. Wenn ich diese Lösung verwende, funktioniert es erst, nachdem ich 'popoverViewController.tableView.rowHeight' zuerst aufgerufen habe oder die Zählung und Höhe nur '0' zurückgeben. Wie kann ich dies tun, ohne zuerst auf die Höhe zuzugreifen? –

+0

Normalerweise setze 'tableview.rowHeight = 44' in' viewDidLoad'. – zisoft

17

Aufschalten der preferredContentSize Eigenschaft in Ihrer Erweiterung der uitableviewcontroller, wie folgend:

override var preferredContentSize: CGSize { 
    get { 
     let height = calculate the height here.... 
     return CGSize(width: super.preferredContentSize.width, height: height) 
    } 
    set { super.preferredContentSize = newValue } 
} 

Für die Berechnung Höhe auschecken tableView.rectForSection(<#section: Int#>)

+0

Dies wird aufgerufen, bevor Zeilen zu meiner Tabelle hinzugefügt werden, also hat 'rectForSection' eine Höhe von Null. –

0

Als erstes zuerst: Alle Kommentare sind gut und helfen voll. Ich habe wenig in meiner Logik geändert, die meine VC als wiederverwendbare Komponente macht.

Aufruf dieser Methode innerhalb viewWillAppear:(BOOL)animated:

-(void) setPopOverPreferedContentHeight { 

    if (self.popoverPresentationController && self.tableView.contentSize.height < MAX_POPOVER_HEIGHT) { 
      self.preferredContentSize=self.tableView.contentSize; 
    } else if (self.popoverPresentationController){ 
     self.preferredContentSize = CGSizeMake(self.tableView.contentSize.width, MAX_POPOVER_HEIGHT); 
    } 
} 
17

In Ihrem UITableViewController des viewDidLoad() Sie einen Beobachter hinzufügen:

self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil) 

Dann fügen Sie diese Methode:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    self.preferredContentSize = tableView.contentSize 
} 

schließlich in viewDidDisappear() Stellen Sie sicher, dass Sie den Beobachter entfernen:

tableView.removeObserver(self, forKeyPath: "contentSize") 

Auf diese Weise passt das Popover die Größe automatisch an den Inhalt an, wann immer es geladen oder geändert wird.

+0

Danke für die Antwort Adrian und Bo. Ich möchte die Popover-Animation bei der Größenänderung deaktivieren. Wie kann ich das erkennen? –

+0

@AdityaShinde Bitte fragen Sie dies als eine andere Frage –

0

Für Swift 4, wenn Sie die Inhaltsgröße beobachten möchten, fand ich, dass dies die optimale Lösung ist. Berichterstattung hier, da ich nicht ein komplettes Beispiel Online gefunden:

class MyTableViewController: UITableViewController { 

    private var kvoContext = 0 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     addObserver(self, forKeyPath: #keyPath(tableView.contentSize), options: .new, context: &kvoContext) 

    } 

    override func viewDidDisappear(_ animated: Bool) { 
     removeObserver(self, forKeyPath: #keyPath(tableView.contentSize)) 
     super.viewDidDisappear(animated) 
    } 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if context == &kvoContext, keyPath == #keyPath(tableView.contentSize), 
      let contentSize = change?[NSKeyValueChangeKey.newKey] as? CGSize { 
      self.popoverPresentationController?.presentedViewController.preferredContentSize = contentSize 
     } 
    } 
}