web-dev-qa-db-fra.com

Redimensionnez la taille de UITableView pour qu'elle corresponde à la taille totale du contenu.

Donc, j'ai un problème très fondamental. J'ai cette UITableView dans une view et j'aimerais rendre la hauteur de cette table aussi élevée que nécessaire pour afficher TOUTES les lignes de la table. Par conséquent, je ne veux pas pouvoir faire défiler, je veux juste que toutes les lignes apparaissent. (Les lignes sont dynamiques en quantité et height).

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping];
    return cellSize.height;
}

S'il y a 20 lignes, la table sera très haute, mais s'il n'y a qu'une seule ligne, elle sera très petite et l'autre contenu n'apparaîtra pas 19 lignes en dessous.

16
abisson

si je le comprends bien, vous devriez pouvoir additionner la hauteur de chaque ligne et ajuster la hauteur de la table en fonction de cela:

CGFloat tableHeight = 0.0f;
for (int i = 0; i < [_stepsArray count]; i ++) {
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
}
self.tableView.frame = CGRectMake(self.tableView.frame.Origin.x, self.tableView.frame.Origin.y, self.tableView.frame.size.width, tableHeight);

vous pouvez le faire immédiatement après [tableView reloadData]

23
Edwin Iskandar

Voici une solution plus simple: il vous suffit de définir sizeToFit sur votre UITableView, une fois que celle-ci a été remplie de cellules. Si vous définissez delegate et dataSource à xib, vous pouvez le faire dans votre méthode viewDidLoad, ou viewDidAppear, comme ceci:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [yourTableView sizeToFit];
}

Mais si vous ajoutez delegate et dataSource quelque part dans le code, vous devez mettre sizeToFit après ceci:

- (void)someMethod
{
    [yourTableView setDelegate:self];
    [yourTableView setDataSource:self];

    [yourTableView sizeToFit];
}

En outre, vous devez le faire après reloadTable, si vous le faites quelque part.

Cela redimensionnera votre table exactement à la hauteur qui est la somme de la hauteur de ses cellules!

7
akelec

Tu peux essayer comme ça,

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        NSLog(@"%f",your_tableView.contentSize.height);
    }
}

Dans Swift 3.0

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row {
        print("\(tableView.contentSize.height)")
    }
}
4
Venk

Définissez une contrainte de hauteur sur la table, connectez-vous à une prise et ajoutez les éléments suivants à votre contrôleur de vue:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableViewHeightContraint.constant = tableView.contentSize.height
}
3
phatmann

Ajouter un observateur pour la propriété contentSize dans la vue tableau et ajuster la taille du cadre en conséquence

Dans viewDidLoad, ajoutez la ligne de code suivante

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];

puis dans le rappel:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         CGRect frame = your_tableview.frame;
         frame.size = your_tableview.contentSize;
         your_tableview.frame = frame;
    }

J'espère que ceci vous aidera.

3
Anooj VM

Utilisez simplement tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; Cela résoudra votre problème.

0
Chauyan