TableViewCell Row Height : Contraindre la hauteur de la cellule en fonction du nombre de ligne

iLandesiLandes Membre
mai 2016 modifié dans Dev. iOS, watchOS, tvOS #1

Bonjour à  tous,


 


Voici le problème sur lequel je planche depuis déjà  24h : Je possède une TableView qui contient 1, 2, 3 ou 4 cellules. J'aimerai contraindre la hauteur de cells en fonctions du nombre total de cells pour qu'elles s'affichent entièrement dans la tableView. En bref quand il y a une ligne à  afficher elle occupe la hauteur totale de la TableView ; pour 2 ligne la tableview est séparé en 2, etc...


 


J'ai un début de piste avec la fonction : tableView:heightForRowAtIndexPath:


 


Quelque chose du genre :



    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        let contentHeight = tableView.contentSize.height
        let numberOfRows = tipsForDay.count
        
        print ("\(contentHeight) - \(numberOfRows)")
        
        if numberOfRows > 0 {
        return contentHeight / CGFloat(numberOfRows)
        } else {
            return contentHeight
        }
    }

Le problème ici est contentHeight vaut 0. Ce n'est pas la taille de tableView....


 


Mais je préférerais utiliser des contraintes. Je ne souhaite pas retomber dans mes vieux travers qui consistaient à  dessiner des vues en fonction de chaque terminal et à  calculer à  la main les hauteurs, largeur et positions. Certains qui ont suivi le Mooc sur Fun me comprendrons. 


 


Depuis pas mal de temps je ne me sert plus que des contraintes d'autolayout. 


 


Comment mettre une contrainte entre la hauteur de ma TableViewCell et ma TableView.


 


D'avance merci de votre aide.


Réponses

  • A priori, en mettant une contrainte sur la hauteur de la cellule qui est la hauteur disponible dans la TableView divisée par le nombre de cellules.


    Bien sûr cette contrainte doit être créée pendant l'exécution, lorsque le multiplicateur est connu (1, 0.5, 0.33 ou 0.25).


     


    Mais je ne suis pas sûr que ça marche dans une TableView.


  • C'est la que je bug. Je sais pas trop comment m'y prendre pour créer une contrainte par code. J'utilise storyboard en général pour fixer les contraintes.


  • LarmeLarme Membre

    Tu peux très bien la mettre en IBOutlet ;)


    Du coup, tu n'as plus qu'à  [laContrainte setConstant:hauteur].


    Maintenant, hauteur peut être [tableView frame].size.height/4..


  • Merci pour votre aide !


     


    J'ai finalement transformé mon code comme ça. 



        override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            let v = tableView as UIView
            let contentHeight = v.bounds.height
            let numberOfRows = tipsForDay.count
            
            print ("\(contentHeight) - \(numberOfRows)")
            
            if numberOfRows > 0 {
            return contentHeight / CGFloat(numberOfRows)
            } else {
                return contentHeight
            }
        }
        
        override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            let v = tableView as UIView
            let contentHeight = v.bounds.height
            let numberOfRows = tipsForDay.count
            if numberOfRows > 0 {
                return contentHeight / CGFloat(numberOfRows)
            } else {
                return contentHeight
            }
        }

    Il semble fonctionner, même quand on change l'orientation. Je ne sais pas si la proche est meilleure qu'avec des contraintes. Qu'en pensez vous ?


  • Du coup tu n'utilises pas du tout les contraintes, mais ça me semble inutile ici.


     


    Tu as quasiment le même code écrit deux fois dans deux fonctions différentes ; ce n'est pas une bonne pratique.




  • Du coup tu n'utilises pas du tout les contraintes, mais ça me semble inutile ici.


     


    Tu as quasiment le même code écrit deux fois dans deux fonctions différentes ; ce n'est pas une bonne pratique.




     


    Merci jpimbert. c'est du code pour effectuer des recherches. Je n'ai pas encore compris la différence entre les deux fonctions. Je cleannerais tout cela après.


     


    Merci à  tous pour votre aide

Connectez-vous ou Inscrivez-vous pour répondre.