Когда устанавливается контент contentSize UITableView?

У меня нет прокрутки UITableView в UIScrollView . Я установил размер кадра UITableView в размере его содержимого.

Когда я добавляю строку в UITableView , я вызываю insertRowsAtIndexPaths:withRowAnimation : в UITableView . Затем я вызываю метод для изменения размера кадра UITableView :

 - (void)resizeTableViewFrameHeight { // Table view does not scroll, so its frame height should be equal to its contentSize height CGRect frame = self.tableView.frame; frame.size = self.tableView.contentSize; self.tableView.frame = frame; } 

Кажется, что contentSize не обновлялся на данный момент. Если я вручную вычисляю фрейм в указанном выше методе на основе количества строк и разделов, то метод работает правильно.

Мой вопрос: как я могу заставить UITableView обновлять его contentSize ? Я полагаю, я мог бы вызвать reloadData и это, вероятно, сделало бы это, но кажется неэффективным перезагрузить всю таблицу, когда я просто вставляю одну ячейку.

6 Solutions collect form web for “Когда устанавливается контент contentSize UITableView?”

Вы можете заставить UITableView рассчитать размер содержимого, вызвав layoutIfNeeded в UITableView.

Пример для подкласса UITableViewController, который должен находиться в представлении контейнера с переменным размером:

 - (CGSize)preferredContentSize { // Force the table view to calculate its height [self.tableView layoutIfNeeded]; return self.tableView.contentSize; } 

Обновление 2016-07-28 Это непроверенный пример Swift того же самого. Он должен работать, но если он не оставит комментария. Там могут быть более приятные или более идиоматические способы сделать это. К сожалению, я не очень хорошо знаком с Свифт.

 override var preferredContentSize: CGSize { get { self.tableView.layoutIfNeeded() return self.tableView.contentSize } set {} } 

Хотя я не люблю KVO (Key-Value Observing), это довольно хороший способ точно узнать, когда изменился contentSize вашей таблицы (а не просто называть методы обновления в кучке случайных мест). Это довольно просто использовать (хотя и несколько загадочно и неявно). Чтобы наблюдать за изменениями в contentSize вашей таблицы, выполните следующие действия:

1) Станьте наблюдателем свойства contentSize вашего стола следующим образом:

 [self.tableView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL]; 

Обычно это делается в контроллере представления, который содержит tableView (например, в viewDidLoad: например).

2) Внедрите метод наблюдения KVO и внесите необходимые изменения:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if(object == self.tableView && [keyPath isEqualToString:@"contentSize"]) { // perform your updates here } } 

3) Удалите контроллер вида в качестве наблюдателя в некоторой логической точке (я вызываю его в dealloc ). Вы делаете это так:

 - (void)dealloc { [self.tableView removeObserver:self forKeyPath:@"contentSize"]; } 

Попробуй это:

 - (void)resizeTableViewFrameHeight { UITableView *tableView = self.tableView; CGRect frame = tableView.frame; frame.size.height = [tableView sizeThatFits:CGSizeMake(frame.size.width, HUGE_VALF)].height; tableView.frame = frame; } 
  1. Добавить наблюдателя (в моем примере в viewDidLoad

     tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil) 
  2. Соблюдать значение

     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let obj = object as? UITableView { if obj == self.tableView && keyPath == "contentSize" { if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize { //do stuff here } } } } 
  3. Удалять наблюдателя, когда он не нужен

     deinit { self.tableView.removeObserver(self, forKeyPath: "contentSize") } 

Вы можете изменить кадр нижнего колонтитула. Я вызываю перед анимированным появлением нижнего колонтитула.

 if self.newTableView.contentSize.height < self.newTableView.frame.height { let additionalHeight: CGFloat = self.newTableView.frame.height - self.newTableView.contentSize.height let tableFooterView = self.newTableView.tableFooterView! let x = tableFooterView.frame.origin.x let y = tableFooterView.frame.origin.y + additionalHeight let width = tableFooterView.frame.width let height = tableFooterView.frame.height tableFooterView.frame = CGRect(x: x, y: y, width: width, height: height) } 

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

С помощью

  tableView.layoutIfNeeded() 

и установка

  tableView.estimatedRowHeight = UITableViewAutomaticDimension 
  • почему этот другой код «addSubView» вызывает различия в поведении
  • Запуск другого кода после просмотра таблицы
  • Слайд таблицы открывается под панелью навигации, когда пользователь кратковременно
  • Изображение не загружается сразу в виде таблицы
  • Настройка программного обеспечения UIActivityIndicatorView для UITableViewController
  • Как взаимодействовать с UITableView в UIViewController?
  • Перезагрузка UITableViewCell без прокрутки UITableView
  • удалить строку UITableView
  • UIButton не показывает подсветку при нажатии на iOS7
  • UITableView отклоняет клавиатуру на reloadData в одном месте, но не в другом?
  • Пользовательский UITableViewCell дает мне: этот класс не является ключевым значением, совместимым с кодировкой
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.