Настроить встраиваемый контент в 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))