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

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

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

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

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

Как мне это сделать? Есть ли более простой способ?

Ответ 1

Отображаются ли ячейки UITableView на пустом месте при прокрутке вниз?

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

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

Здесь, как изменить это поведение:

a) Конструктор интерфейсов

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


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

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

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

b) Программно

Добавьте это к i.e. viewDidLoad (кредиты для ответа Slavco Petkovski и комментарий Cris R)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

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

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

tableView.contentInset = UIEdgeInsetsZero

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

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

  • Выберите контроллер просмотра
  • Инспектор открытых атрибутов
  • В параметрах диспетчера просмотра в разделе "Расширение границ" снимите флажок "Под верхними барами"

Ответ 2

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

Ответ 3

Вы можете сделать это с помощью story boards, если вы используете его:

Storyboard.storyboard
   > YourViewController
       > Attr. inspector
          > Un-check "Adjust scroll view insets"

Ответ 4

Просто добавьте этот код в ViewDidLoad

self.automaticallyAdjustsScrollViewInsets = NO;

Ответ 5

Выберите табличное представление в своем раскадровке и убедитесь, что стиль установлен на "Обычный", а не "Группировка". Этот параметр можно найти на вкладке "Инспектор атрибутов".

Ответ 6

Перейдите к инспектору атрибутов контроллера просмотра, выбрав xib или контроллер в Storyboard. Снимите флажок Настроить прокрутки в в Макет. Это решит проблему. enter image description here

Ответ 7

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

Я переместил его вперед, и появилось пустое пространство. Не уверен, почему, но он работает так, если это что-то под таблицейView, он скрывает пустое пространство.

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

enter image description here

Ответ 8

просто добавьте

self.automaticallyAdjustsScrollViewInsets = false

внутри viewDidLoad()

Ответ 9

self.automaticallyAdjustsScrollViewInsets = NO;

Ответ 10

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

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

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

Ответ 11

Можно добавить предварительно 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 после настройки, то верхнее пространство не будет мешать вам.

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;
}

Ответ 12

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

enter image description here

Ответ 13

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

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

Ответ 14

Нажмите на свой контроллер просмотра и удалите "Настроить прокрутки". Это будет работать. (iOS 7)

Ответ 15

Снимите флажок Adjust Scroll View Insect

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

Ответ 16

Если вы делаете это на iOS 11, автоматическиAdjustsScrollViewInsets не будет работать, поскольку он устарел, следующий код работал у меня в соответствии с ответом в этом сообщении: fooobar.com/questions/23431/...

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

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

Ответ 17

В раскадровке, установите contentInsets вашего tableview к Никогда

enter image description here

Ответ 18

Проверьте рамку таблицы в раскадровке или xib. Mine по умолчанию имеет значение y позиции, поэтому ошибка

Ответ 19

Для меня проблема в том, что UITableView является дочерним по отношению к основному виду, и мне удается исправить корректировку пространства с добавлением UIView на том же уровне, но перед таблицей для него, и отлично работает.

Ответ 20

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

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

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

    return 0.1
}

Ответ 21

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

Ответ 22

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

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

Ответ 23

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

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

Ответ 24

В 2017 году то, что работает для меня, - это просто одна строка

navigationController?.navigationBar.isTranslucent = false

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

Ответ 25

В 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
}

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

Ответ 26

В моем случае я использовал представление контейнера (Main View → Contaner View → UITableView)

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

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

  • выберите "Контроллер табличного представления"
  • Инспектор открытых атрибутов
  • Перейти к → Показать контроллер → Макет → "Выбрать хочет полноэкранный режим"

Ответ 27

Вы можете использовать этот код в 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];

Ответ 28

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

Ответ 29

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

Ответ 30

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

Просто выберите tableview и clic Editor → Arrange → Send to Front

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