Измените размер 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 строках ниже.
Ответы
Ответ 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
}