web-dev-qa-db-fra.com

Comment définir la hauteur automatique de la cellule statique dans UITableViewController?

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): Storyboard view controller

Et après le lancement: Simulator view Notez que la vue texte se termine sous le bas de l'écran.

J'ai oublié de mentionner que je cible iOS 7.0+.

27
bpiec

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

6

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

65
Ryan Romanchuk

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
} 
11
Mat0

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/

4
Fogmeister

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.

3
Riajur Rahman

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.

1
Baron Ch'ng

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];
}
1
Tanuj

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.

1
svrushal