it-swarm.com.ru

Установить постоянную вставку содержимого UITableView

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

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

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

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

59
cojoj

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

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

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

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

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

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

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

В Свифте:

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

автоматически AdjustsScrollViewInsets устарела в iOS11 (и принятое решение больше не работает). использовать:

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

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

4
Fran Martin

После одного часа испытаний единственный способ, который работает на 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];
}

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

2
Kappe

Вот как это можно легко исправить с помощью раскадровки (iOS 11 и Xcode 9.1):

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

2
Pink Panther

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

0
user3168555