Измените размер UITableView высотой настолько, насколько это необходимо, чтобы соответствовать только полному размеру содержимого - программирование
Подтвердить что ты не робот

Измените размер UITableView высотой настолько, насколько это необходимо, чтобы соответствовать только полному размеру содержимого

Итак, у меня есть очень простая проблема. У меня есть UITableView в view, и я бы хотел, чтобы высота этой таблицы была настолько высокой, насколько нужно, чтобы отображать ВСЕ строки в таблице. Поэтому я не хочу прокручивать, я просто хочу, чтобы все строки отображались. (Строки динамические по количеству и 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;
}

Если есть 20 строк, таблица будет очень высокой, но если есть только одна строка, она будет очень маленькой, а другое содержимое не будет отображаться в 19 строках ниже.

4b9b3361

Ответ 1

если я правильно понимаю, вы должны иметь возможность добавить высоту для каждой строки и отрегулировать высоту таблицы, основываясь на этом:

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);

вы можете сделать это сразу после [tableView reloadData]

Ответ 2

Вот более простое решение: вам нужно только установить sizeToFit на UITableView, после того как он будет заполнен ячейками. Если вы установите delegate и dataSource через xib, вы можете сделать это в своем методе viewDidLoad или viewDidAppear, например:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [yourTableView sizeToFit];
}

Но если вы добавите delegate и dataSource где-то в коде, вы должны поместить sizeToFit после этого:

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

    [yourTableView sizeToFit];
}

Кроме того, вы должны сделать это после reloadTable, если вы это сделаете.

Это позволит изменить размер таблицы точно до высоты, которая является суммой высоты его ячеек!

Ответ 3

Вы можете попробовать это,

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

В 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

Добавить наблюдателя для свойства contentSize в представлении таблицы и соответствующим образом скорректировать размер кадра

В viewDidLoad добавьте следующую строку кода

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

то в обратном вызове:

- (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;
    }

Надеюсь, это поможет вам.

Ответ 5

Просто используйте tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; Это решит вашу проблему.

Ответ 6

Задайте ограничение на высоту таблицы, подключитесь к розетке и добавьте в контроллер вида следующее:

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