it-swarm.com.ru

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

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

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

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

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

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

165
hetelek

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

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

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

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

а) Интерфейсный конструктор

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


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

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

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

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

Добавьте это, например, viewDidLoad (кредиты на ответ Slavco Petkovski и Cris R комментарий)

// 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"
370
lekksi

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

70
irblue

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

31
netshark1000

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

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

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

enter image description here

9
André Cytryn

Ничто из вышеперечисленного не помогло мне. но делаю это помогло:

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

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

5
Tung Fam

Там может быть предварительно добавлено 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;
}
4
akaDuality

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

enter image description here

3
Mike S

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

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

3
hetelek

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

enter image description here

3
Marwen Doukh - Maruän Duch

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

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

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

3
Jacobo Koenig

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

2
Arthi

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

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

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

    return 0.1
}
2
Anusha Kottiyal

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

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

1
Austin Whitelaw

В 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
Mayur Karmur

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

navigationController? .navigationBar.isTranslucent = false

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

1
Dew Time

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

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

1
jr.ong

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

1
Junaid Ahmed

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

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

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

0
Daniel Meza

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

0
Sandeep Ahuja

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

0
Sebyddd

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

0
JAHelia

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away.https://i.stack.imgur.com/vRNfV.png

0
NitinLandge

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

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

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

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

Ошибка Xcode 8 ...

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

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

0
Carl

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

self.extendedLayoutIncludesOpaqueBars = true
0
Jose Carrillo

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

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

0
Alexander