web-dev-qa-db-fra.com

Comment ajuster mon popover à la taille du contenu de ma vue de table en swift?

J'utilise popoverPresentationController pour afficher mon popover. La UITableViewController utilisée pour afficher en tant que popover est créée par programme et contient généralement 1 à 5 lignes. Comment configurer cette popover pour ajuster la taille au contenu de la table?

Code pour mon 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

Extraire la propriété preferredContentSize de UIViewController :

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

Dans votre viewDidLoad() de UITableViewController, vous pouvez ajouter un observateur:

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

Puis ajoutez cette méthode:

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

Enfin, dans viewDidDisappear(), veillez à supprimer l'observateur:

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

De cette façon, le popover ajustera automatiquement la taille pour s’adapter au contenu, qu’il soit chargé ou modifié.

27
Bo Frese

Remplacez la propriété preferredContentSize dans votre extension de la uitableviewcontroller comme suit:

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

Pour calculer la hauteur, vérifiez tableView.rectForSection(<#section: Int#>)

18
Philip De Vries

Pour Swift 4, si vous voulez observer la taille du contenu, j'ai trouvé que c'était la solution optimale. Le signaler ici car je n'ai pas trouvé d'exemple complet en ligne:

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
Daniele Bernardini

La première chose à faire: tous les commentaires sont bons et aident énormément . J'ai peu modifié ma logique, ce qui rend mon VC comme composant réutilisable.

Appel de cette méthode dans 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