Удалить пустое пространство перед ячейками в UITableView


172

В настоящее время я пытаюсь поместить UITableViewв другое место, а не в верхней части моего контроллера представления. С учетом сказанного, он пытается добавить заголовок в верхней части для учета панели навигации, но это не нужно, так как у меня нет в верхней части моего контроллера.

Если я поставлю верхний левый угол того места, UITableViewгде я хочу, чтобы ячейки были, он не поместит туда ячейки:

Теперь, если я просто переместлю табличное представление вверх, чтобы ячейки были в правильном месте, у меня возникнет другая проблема - ячейки можно перемещать туда при прокрутке (это мой палец над контроллером навигации):

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

Как бы я поступил так? Есть ли более простой способ?

Ответы:


378

Есть ли ячейки UITableViewшоу на пустом месте при прокрутке вниз?

Если это так, то проблема может заключаться во вставке, которая добавляется к UITableViewконтроллеру навигации, который вы видите. Вставка добавляется в табличное представление для размещения содержимого под панелью навигации, когда прокрутка не происходит. При прокрутке таблицы содержимое прокручивается и отображается под прозрачной панелью навигации. Такое поведение, конечно, желательно только в том случае, если табличное представление начинается непосредственно под панелью навигации, что здесь не так.

Еще одна вещь, на которую следует обратить внимание, это то, что iOS корректирует содержимое вставки только для первого представления в иерархии представлений, если оно есть UIScrollViewили его потомок (например, UITableViewи UICollectionView). Если ваша иерархия представлений включает в себя несколько представлений прокрутки, automaticallyAdjustsScrollViewInsetsвнесите коррективы только в первое.

Вот как можно изменить это поведение:

а) Интерфейсный Разработчик

  • Выберите вид контроллера
  • Инспектор открытых атрибутов
  • В инспекторе атрибутов IB (когда выбран контроллер представления) есть свойство «Настроить вставки вида прокрутки», которое включено по умолчанию. Снимите этот флажок:


    (Изображение предоставлено Dheeraj D )

Я не уверен, какая версия Xcode представила эту опцию (не заметила ее в примечаниях к выпуску), но она по крайней мере доступна в версии 5.1.1.

Изменить: чтобы избежать путаницы, это был третий вариант, упомянутый в комментариях

б) программно

Добавьте это к ie viewDidLoad(кредиты на ответ Славко Петковски и комментарий Криса Р )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

в) Это может быть актуально для старых школьников

Вы можете исправить это, добавив

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Или если вы используете IB и если панель навигации не прозрачна (не видно по скриншоту)

  • Выберите вид контроллера
  • Инспектор открытых атрибутов
  • В параметрах View Controller «Расширить края» снимите флажок «Under Top Bars»

2
Отмена выбора «Under Top Bars» в UIView мне очень понравилась. Спасибо.
Андреас Оверлэнд

Я сходил с ума, используя «Paging Enabled», и прокрутка перемещалась только по высоте панели навигации, а не по всей ячейке. Спасибо.
LordParsley

8
Третий вариант: отмените выбор «Настроить вид прокрутки вставок» - работает как шарм. спасибо лекси!
Стас Жуковский

2
self.automaticsAdjustsScrollViewInsets = false в Swift работает "de pelos"!
Cris R

1
Благодаря установке UIEdgeInsetsZero требуется, если повторно использовать таблицу в новом контроллере таблиц каждый раз, когда она отображается, в противном случае появляется один и тот же белый пробел, который становится все больше и больше.
Малхал

71

У меня была такая же проблема, и я почти уверен, что когда-то там был UIView. Просто скопировав все табличное представление, удалив его и вставив снова, я исправил это.


7
это действительно очень странно. Это решило проблему. Есть идеи, когда это произойдет?
MiQUEL

Я думаю, что вы можете решить это намного проще, следуя моему ответу от 10 октября 13
netshark1000

Была такая же проблема. Удаление его и чтение работало для меня также.
СМА

3
Насколько я знаю, вставки содержимого представления прокрутки настраиваются автоматически (если автоматически AdjustsScrollViewInsets = YES, которым оно является по умолчанию), только если представление прокрутки является первым дочерним элементом в иерархии представления контроллера представления. Я предполагаю, что это решение работает, потому что после вставки копии табличное представление перестает быть первым представлением в иерархии представлений.
Леккси

Происходит следующее: когда tableView - это первое, что вы добавляете в представление, система думает, что ей нужно оставить место для навигации. Я предполагаю, что некоторые люди добавляют tableView, а затем headerView. После некоторых проблем они затем удаляют tableView и добавляют его снова, что происходит тогда, когда headerView является первым элементом в иерархии, поэтому системе больше не нужно адаптироваться, проблема решена. Я знаю, потому что я использую только код, поэтому в моем случае пришлось добавить сначала заголовок, а затем таблицу, чтобы исправить это.
Луис Джерард

40

Выберите вид таблицы в вашей раскадровке и убедитесь, что стиль установлен на «Обычный», а не «Сгруппированный». Вы можете найти этот параметр на вкладке «Инспектор атрибутов».


Удивительно ... это было странным решением для меня ... Я просто скопировал и вставил весь контроллер представления, но каким-то образом этот вставленный tableView контроллера представления имел это странное смещение. Этот ответ решил мою проблему
daisura99

Это решило проблему, но теперь разделы заголовка ведут себя по-другому. Кто угодно?
Бруно Мунис

Будьте здоровы. Где бы вы ни были в этом мире. Благослови тебя навсегда.
Габучан

9

В моем случае у меня была UILabel под UITableView в иерархии представления.

Я переместил его «вперед», и появилось пустое пространство. Не уверен, почему, но он работает следующим образом, если в tableView есть что-то, он скрывает пустое пространство.

Также вы можете попробовать установить / снять флажок «Настроить вставки вида прокрутки» в инспекторе контроллера представлений на раскадровке.

введите описание изображения здесь


2
У меня есть сгруппированный UITableView и снял флажок «Настроить вставки вида прокрутки».
Мэтт

5

Ничто из перечисленного не помогло мне. но это помогло :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

вместо «-64» вы можете указать любой другой номер в зависимости от высоты панели навигации.


4

Там может быть предварительно добавлено UIRefreshControl. У меня есть эта проблема с кодом, как это:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Как видите, я установил self.refreshController сразу послеinit

Но, если вы установите refreshControlпосле установки, то top-space вам не мешает.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Я не могу поверить, что это была настоящая проблема. Для меня это проблема только на <= 9.3.5. Как в мире вы поняли это?
Сирены

4

Если вы делаете это на iOS 11, автоматически AdjustsScrollViewInsets не будет работать, поскольку это устарело, следующий код работал для меня согласно ответу в этом посте: https://stackoverflow.com/a/44391269/5476481

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

Надеюсь это поможет.



3

Я не могу сказать наверняка, но похоже, что у вас есть дополнительный UIView, застрявший между тем, где начинаются ячейки прототипа, и вершиной UITableView. Мое изображение выглядит точно так же, как ваше, если вы удалите текст / строки, которые я добавил.

введите описание изображения здесь


3

Я до сих пор не уверен, что вызвало это дополнительное пространство вверху, но я обнаружил, что удаление UITableView с пробелом и замена его новым заняло место.

Должно быть, я случайно перетащил туда UIView, но не мог выбрать его, поэтому не мог удалить.


3

Swift 5

Попробуй с удалением tableHeaderView и tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Проверьте вашу рамку таблицы в раскадровке или XIB. Мой по умолчанию имеет значение позиции Y, следовательно, ошибка


2

В моем приложении также возникла такая проблема. Я установил верхний край таблицы равным нулю. Также попробовал установить falseдля automaticallyAdjustsScrollViewInsets. Но не сработало.

Наконец-то я получил рабочее решение. Я не знаю, это правильный путь. Но реализация heightForHeaderInSectionметода делегата работала для меня. Вы должны вернуть ненулевое значение, чтобы работать с этим (возвращаемый ноль будет отображать то же пространство, что и раньше).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

В 2017 году у меня работает просто эта линия

navigationController? .navigationBar.isTranslucent = false

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


Это сделало это и для меня. Спасибо!
scurioni

2

В iOS 11 и более поздних версиях Apple изменила свойство для настройки вставки содержимого. Использование contentInsetAdjustmentBehaviorи установите .neverдля удаления дополнительного пространства выше UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Я надеюсь, что это поможет вам.


1

Что ж, для меня проблема возникла, когда я перетащил прототип ячейки из меню в представление таблицы. Поэтому я удалил это и просто установил для прототипа ячейку 1 в свойствах инспектора табличного представления


1

Я делаю это программно, и я просто переместил свой addSubview (tableView) вниз после добавления всех моих других подпредставлений, и это решило мою проблему!

Не уверен, почему это появляется только на устройстве, а не на моем симуляторе, но в любом случае есть простое решение!


1

Пока UITableView не является первым подпредставлением контроллера представления, пустое пространство не появится.

Решение: Добавьте скрытый / чистый объект представления (виды, метки, кнопки и т. Д.) В качестве первого подпредставления контроллера представления (на том же уровне, что и UITableView, но перед ним).


Я потратил так много времени, пытаясь понять это, пробуя многие предложения здесь и на других постах. Это тот, который решил это. Спасибо! Можете ли вы объяснить почему или опубликовать ссылку на какой-нибудь документ? Я только изучаю iOS, и он настолько отличается от Android! :)
Марк

0

UIView можно вставить вверху и внизу таблицы (перетаскивание). Установите их свойства как прозрачные и высотой 1 пикс. Это делается для того, чтобы убрать лишнюю прокладку перед ячейками.


0

У меня также была эта проблема: tableView не был последним представлением в иерархии. В моем случае у меня было представление выше (даже если они не перекрывали друг друга), поэтому я перетащил его над таблицей в иерархии, и это было сделано.


0

Я только что нашел решение для этого.

Просто выберите вид таблицы и нажмите Редактор -> Упорядочить -> Отправить на фронт

Это сработало для меня и надеюсь, что это поможет вам всем.


0

В моем случае я использовал ContainerViewController и помещал в него UITableViewController. После удаления ContainerViewController. Проблемы уходят.


0

Ошибка Xcode 8 ...

Попробуйте сначала, если ваш стиль раскадровки UITableView установлен на Plain.

Установите стиль таблицы на Сгруппированный, а затем вернитесь к Обычному Это удалило место в моем приложении во главе моего UITableView.


0

В моем случае я использовал вид контейнера. (Основной вид -> Вид Contaner -> UITableView)

Я думаю, что дополнительное пространство сверху похоже на пространство панели уведомлений устройства (где отображается время, батарея). Я действительно, это не предположение.

То, что я сделал, было от UI Builder:

  • выберите контроллер представления таблицы завершенным
  • Инспектор открытых атрибутов
  • Перейдите -> View Controller -> Layout -> «Выбрать хочет полный экран»

0

Вы можете использовать этот код в viewDidLoad или viewDidAppear, где создается ваша таблица:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

установите Расширенные края ViewController в раскадровке так, чтобы underTopBarсвойство не проверялось.


0

Была такая же проблема. Я решил это, добавив следующее к viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true


-2

проверить

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • упомянуть делегатную функцию tableview cellForRowAtIndexPath:
  • он может обрабатываться как IOS 6 и 7.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.