it-swarm.com.de

Wie kann ich mein Popover schnell an die Größe des Inhalts in meiner Tabellenansicht anpassen?

Ich verwende popoverPresentationController, um meinen Popover anzuzeigen. Die als Popover verwendete 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?

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)
}
25
Henny Lee

Überprüfen Sie die preferredContentSize-Eigenschaft von UIViewController :

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

In viewDidLoad() Ihres UITableViewControllers können Sie einen Beobachter hinzufügen:

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

Dann fügen Sie diese Methode hinzu:

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

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

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

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

27
Bo Frese

Überschreiben Sie die preferredContentSize-Eigenschaft in Ihrer Erweiterung der uitableviewcontroller wie folgt:

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

Zur Berechnung der Höhe check out tableView.rectForSection(<#section: Int#>)

18
Philip De Vries

Für Swift 4, wenn Sie die Inhaltsgröße beobachten möchten, habe ich festgestellt, dass dies die optimale Lösung ist. Melden Sie es hier, da ich kein vollständiges Beispiel online gefunden habe:

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

Das erste, was zuerst geht: Alle Kommentare sind gut und helfen voll. Ich habe an meiner Logik wenig geändert, was mein VC zu einem wiederverwendbaren Bestandteil macht.

Aufruf dieser Methode in 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);
   }
}
0
kaushal