TableView comme un picker

Bonjour,


 


J'essaye de créer un picker. J'ai une tableView avec des éléments. Je voudrais que lorsque l'utilisateur sélectionné une Cell, cette Cell soit afficher au centre de ma tableView. J'ai implémenté



 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
    }

Le problème est que cela ne fonctionne ni pour les premières ni pour les dernières Cell. 


 


J'ai plein d'idées compliqués en tête mais il doit y avoir une idée simple.


 


D'avance merci pour votre aide


 


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu ne peux jamais avoir ni la première cellule, ni la dernière, au centre. Qu'est-ce que tu imagines apparaà®tre au-dessus/en-dessous ?


  • iLandesiLandes Membre
    novembre 2017 modifié #3

    Au dessus j'imaginais du blanc avec contentOffset ou des cellules vides non selectionables.


     


    Après je vais peut-être m'orienter sur des données en à  afficher en boucle un peu comme dans un picker. Mais là  je bug, comment remplir ma table view avec des données en boucle comme dans les pickers?


  • CéroceCéroce Membre, Modérateur
    Afficher en boucle n'est guère faisable parce que la datasource doit dire combien de lignes comporte la table.
  • Pourtant les pickers ont l'air de travailler avec une tableView. Je pense qu'il modifie le tableau qui sert de source de données pendant le scroll comme ["Lun", "Mar", "Mer", Jeu", "Ven", "Sam", "Dim"] qui passe à   ["Mar", "Mer", Jeu", "Ven", "Sam", "Dim", "Lun"] quand on scroll.


     


    Je vais partir sur des Pickers pour mon appli mais je laisse le sujet ouvert car cela me semble intéressant.


  • CéroceCéroce Membre, Modérateur
    novembre 2017 modifié #6

    Pourtant les pickers ont l'air de travailler avec une tableView.

    C'est exact, on voit qu'en interne, une classe UIPickerTableView est utilisée.
     

    Je pense qu'il modifie le tableau qui sert de source de données pendant le scroll comme ["Lun", "Mar", "Mer", Jeu", "Ven", "Sam", "Dim"] qui passe à   ["Mar", "Mer", Jeu", "Ven", "Sam", "Dim", "Lun"] quand on scroll.

    J'ai pensé à  une autre solution: quand la tableview demande combien il y a de lignes, on peut donner une valeur très grande, comme Int.max. Et on demande à  scroller à  la ligne Int.max/2 (à  rectifier pour être multiple de nbrItems).

    Ensuite, on peut obtenir le numéro de l'item par
    item = indexPath.row % nbrItems

    Je n'ai pas tous les détails, mais l'idée est que Int.max est tellement grand qu'il n'y a aucune chance que l'utilisateur fasse défiler jusque-là .
  • Vu qq part sur SO, donner une très grande valeur gent INT_MAX génère des bugs


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