Настроить встраиваемый контент в UITableView

В моем приложении у меня есть UISearchBar под UINavigationBar, поэтому он всегда отображается пользователю. В этом случае мне пришлось установить contentInset с дополнительными 44px, поэтому UIScrollView будет прокручиваться под UISearchBar (точно так же, как в Contacts.app). И не было бы проблем со статическими UITableView, но в моем случае я должен перезагрузить его содержимое, переключиться на UISearchDisplayController и т.д. Поэтому, когда я звоню:

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];

Все работает до тех пор, пока, например, Я тяну, чтобы обновить... (для этого я использую SSPullToRefresh).

Итак, мой вопрос: Как я могу установить contentInset навсегда, поэтому мне не пришлось бы беспокоиться о каких-либо изменениях, происходящих с данными внутри UITableView?

Ответ 1

Вероятно, это была какая-то моя ошибка из-за того, что я возился с автозапуском и раскадрой, но я нашел ответ.

Вы должны позаботиться об этом маленьком человеке в Инспекторе атрибутов . asvi

Он должен быть снят, поэтому значение по умолчанию contentInset не будет установлено после каких-либо изменений. После этого он просто добавляет однострочный к viewDidLoad:

[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example

iOS 11, обновление Xcode 9

Похоже, что предыдущее решение уже не является правильным, если речь идет о iOS 11 и Xcode 9. automaticallyAdjustsScrollViewInsets устарел и сейчас, чтобы добиться аналогичного эффекта, вам нужно пойти в Inspector Size, где вы можете найти это: введите описание изображения здесь
Кроме того, вы можете сделать то же самое в коде:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}

Ответ 2

В Swift:

override func viewDidLayoutSubviews() {
      super.viewDidLayoutSubviews()
      self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}

Ответ 3

automaticAdjustsScrollViewInsets устарел в iOS11 (и принятое решение больше не работает). используйте:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}

Ответ 4

Добавьте в числоOfRowsInSection свой код [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];. Таким образом, вы будете устанавливать свой контент. Всегда загружайте данные в таблицу.

Ответ 5

После одного часа тестов единственный способ, который работает на 100%, следующий:

-(void)hideSearchBar
{
    if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
    {
        self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

-(void)viewDidLayoutSubviews
{
    [self hideSearchBar];
}

при таком подходе вы всегда можете скрыть панель поиска, если она пуста

Ответ 6

Вот как это можно легко устранить через Storyboard (iOS 11 и Xcode 9.1):

Выберите "Просмотр таблицы" > "Инспектор размеров" > "Вставки содержимого: никогда"

Ответ 7

Попробуйте установить tableFooterView tableView.tableFooterView = UIView (frame: CGRect (x: 0, y: 0, ширина: 0, высота: CGFloat.leastNonzeroMagnitude))