J'ai un problème avec une cellule prototype (qui est remplie à partir de Firebase), où la hauteur de cellule n'est pas définie correctement malgré les contraintes définies.
J'ai essayé de définir ce qui suit:
import UIKit
import Firebase
class PVVViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var PVVList = [PVVModel]()
@IBOutlet weak var TableViewPVV: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
LoadDataFromPVV()
// TableViewPVV.rowHeight = 100
TableViewPVV.rowHeight = UITableView.automaticDimension
TableViewPVV.estimatedRowHeight = 100
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return PVVList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
//creating a cell using the custom class
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PVVViewControllerTableViewCell
//the PVV object
let PVV: PVVModel
//getting PVV for selected position
PVV = PVVList[indexPath.row]
//adding values to labels
cell.PVVData.text = PVV.BodyText
//returning cell
return cell
}
func LoadDataFromPVV() {
databaseReference = Database.database().reference()
let refPVV = Database.database().reference(withPath: "PVV").queryOrdered(byChild: "Status").queryEqual(toValue: "Active")
refPVV.observeSingleEvent(of: .value, with: { (snapshot) in
//if the reference have some values
if snapshot.childrenCount > 0 {
//clearing the list
self.PVVList.removeAll()
//iterating through all the values
for PVV in snapshot.children.allObjects as! [DataSnapshot] {
//getting values
let PVVObject = PVV.value as? [String: AnyObject]
let PVVText = PVVObject?["BodyText"]
//creating PVV object with model and fetched values
let PVV = PVVModel(BodyText: PVVText as! String?)
//appending it to list
self.PVVList.append(PVV)
}
//reloading the tableview
self.TableViewPVV.reloadData()
}
})
}
}
Cela ne fonctionne pas. Lorsque vous utilisez UITableView.automaticDimension, la hauteur de la cellule est par défaut de 44.
Cependant, si la hauteur de la cellule peut être augmentée si je règle explicitement TableViewPVV.rowHeight sur une valeur comme 100.
REMARQUE: J'ai également besoin de définir explicitement la largeur souhaitée de l'étiquette ou la valeur rowHeight spécifiée est ignorée.
REMARQUE ÉGALEMENT: J'ai les contraintes suivantes définies sur le libellé: Trailing Space to Superview = 2, Leading space = 2, Bottom space> = 2, Top Space> = 2.
Quelques captures d'écran comme suit:
Nayem: modifié pour ajouter une nouvelle image pour vous de ce à quoi ressemble le contenu sans définir la largeur souhaitée, et avec la hauteur définie à 100.
override func viewDidLoad() {
super.viewDidLoad()
TableViewPVV.rowHeight = UITableView.automaticDimension
TableViewPVV.estimatedRowHeight = 100
}
J'espère pouvoir ajuster dynamiquement la hauteur de mon étiquette (PVVData) pour l'adapter au texte capturé depuis Firebase.
3 Réponses :
Veuillez ajouter cette méthode dans votre classe
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
Assurez-vous que l'attribut label est comme celui-ci:
Et définissez la contrainte appropriée pour l'étiquette.
J'ai également essayé ce qui suit (swift): func tableView (tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension} func tableView (tableView: UITableloView, estiméHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {return UITableViewAutomaticDimension} func tableView (tableView: UITableloView, estiméHeightForRowAtIndexPath) } Cependant, cela n'a pas fonctionné non plus. AFAIK, vous n'avez pas besoin de cette méthode si vous utilisez: TableViewPVV.rowHeight = UITableView.automaticDimension TableViewPVV.estimatedRowHeight = 100
Essayez simplement la méthode ci-dessous:
définissez les contraintes comme indiqué dans l'image ci-dessous ( sans hauteur minimale ).
définir des contraintes comme indiqué dans l'image ci-dessous ( avec une hauteur minimale ).
pour une hauteur minimale, vous avez besoin d'une contrainte de hauteur. p>
Définir le nombre de lignes à 0 .
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
Salut Shezad, j'ai essayé d'ajouter une contrainte de hauteur> = xx, et de définir le nombre de lignes à 0. Cependant, cela ne fonctionne pas. C'est vraiment déroutant car j'ai examiné diverses solutions pendant des jours, sans chance.
Non. Ne suggérez rien en définissant une hauteur explicite. Cela n'aidera pas à atteindre la hauteur automatique. Au lieu de cela, la hauteur sera au minimum de 40 ou une autre valeur supérieure . Que faire si les données ne remplissent qu'une seule ligne et que la taille de la cellule ne doit pas nécessairement être> = 40?
@nayem j'ai donné 40 pour un exemple, il peut donner la hauteur minimale dont il a besoin.
Non. Son exigence ne dit pas qu'il veut avoir une hauteur minimale quelle que soit la valeur de n'importe quelle cellule. Il a réellement besoin de la hauteur dynamique. Et votre solution est contradictoire avec cela.
@nayem mais la solution ci-dessus fonctionne pour une hauteur dynamique, n'est-ce pas?
Cela fonctionne en quelque sorte. Il n'est pas nécessaire d'avoir la hauteur dynamique pour travailler. Il n'est pas nécessaire de modifier la contrainte de hauteur si vous n'en avez vraiment pas besoin.
@nayem a édité la réponse avec et sans hauteur minimale
Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacée vers le chat .