Удалите пустое пространство перед ячейками в 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
Это сработало для меня и надеюсь, что это поможет всем вам.