J'utilise IB et storyboard et j'ai défini UITableViewController
. Là, j'ai défini trois cellules statiques. Les deux premiers doivent avoir une hauteur donnée, mais le dernier doit automatiquement remplir l'espace restant (ancre au bas de la vue). Comment puis-je atteindre cet objectif? Je peux utiliser la mise en page automatique pour les contrôles à l'intérieur la cellule mais elle est grisée pour la cellule elle-même.
La meilleure solution serait de le faire depuis IB mais les solutions programmatiques sont également les bienvenues.
MODIFIER:
Voici à quoi cela ressemble dans mon storyboard (les couleurs sont pour visualiser des contrôles séparés, chaque contrôle a des contraintes requises):
Et après le lancement: Notez que la vue texte se termine sous le bas de l'écran.
J'ai oublié de mentionner que je cible iOS 7.0+.
Ok essayez ceci
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
if indexPath.row == 0 {
return firstRowHeight
}
else if indexPath.row == 1 {
return secondRowHeight
}
else {
return tableView.frame.size.height - firstRowHeight - secondRowHeight
}
}
La seule chose qui peut être un problème est que cette méthode va s'exécuter avant que la vue ne définisse la hauteur de tableView
Vous pouvez réellement utiliser UITableViewAutomaticDimension
avec des cellules statiques. Concevez vos cellules statiques comme d'habitude et définissez manuellement vos cellules comme des hauteurs dynamiques en ajoutant
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240 // Something reasonable to help ios render your cells
Remplacez maintenant le délégué heightForRow
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
La seule autre mise en garde que j'ai remarquée avec cette technique est que vous devez utiliser NSAutolayout
pour créer une contrainte sur le conteneur inférieur (le conteneur de UITableViewCell
). Supposons donc que vous ayez un conteneur à l'intérieur de contentView de la cellule qui aura une hauteur dynamique, pour que cela soit correctement rendu, vous devez créer une contrainte d'espace en bas.
Si vous avez des cellules statiques qui ont des hauteurs fixes, je recommande de retourner cette taille en activant la ligne dans tableView:heightForRowAtIndexPath:indexPath
Assurez-vous de remplacer heightForRowAtIndexPath! Sinon, il ne s'affichera pas correctement à partir de mes expériences
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
J'ai couvert cela dans un article de blog en utilisant une vue de tableau statique et en définissant les hauteurs de cellule à l'aide de la mise en page automatique. Les cellules sont toutes définies dans le générateur d'interface.
Vous devez activer les hauteurs de cellule automatiques dans le code, mais ce ne sont que quelques lignes.
Je montre tout, y compris IB et le code.
Regarde
http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/
Si toute la hauteur de cellule de tableview est dynamique, vous pouvez essayer ceci
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240
ou une tableview a besoin d'une cellule de hauteur fixe et d'une cellule de hauteur dynamique, vous pouvez vérifier la réponse Hauteur de cellule tableview dynamique et statique
J'espère que cela aide.
La réponse de Ryan Romanchuk est excellente. J'ai une astuce qui peut aider un débutant comme moi.
Comme il s'agit d'un cas de cellule statique, vous pourriez être enclin à utiliser IBOutlet
pour chaque champ dynamique. La définition de valeurs dans say UILabel
outside tableView
cycle de chargement n'aura pas la nouvelle hauteur considérée.
Pour permettre à la hauteur dynamique de fonctionner, vous pouvez affecter des valeurs dans le délégué cellForRowAtIndexPath
substitué afin que la mise en page automatique puisse prendre la nouvelle hauteur. Appelez tableView.reloadData()
lorsque vous souhaitez mettre à jour les champs.
Pour la hauteur statique (non pilotée par les données), vous pouvez simplement retirer la cellule une fois et stocker la hauteur:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSNumber *height;
if (!height) {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
height = @(cell.bounds.size.height);
}
return [height floatValue];
}
Pas sûr de IB et en utilisant la mise en page automatique
Mais en utilisant par programmation,
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
En utilisant cette méthode, vous pouvez vérifier l'indexpath.row. Et en utilisant ce retour, la hauteur différente.