Почему в верхней части моего UITableView есть дополнительные отступы со стилем UITableViewStyleGrouped в iOS7

637

Начиная с iOS7, в верхней части моей страницы есть дополнительное пространство, UITableViewкоторое имеет стиль UITableViewStyleGrouped.

Вот пример:

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

Представление таблицы начинается с первой стрелки, необъяснимое заполнение составляет 35 пикселей, затем UIViewвозвращается зеленый заголовок viewForHeaderInSection(где сечение равно 0).

Может кто-нибудь объяснить, откуда берется это количество 35 пикселей и как я могу избавиться от него, не переключаясь на UITableViewStylePlain?


Замечания:

В iOS 11 и более поздних версиях:

tableView.contentInsetAdjustmentBehavior = .never
esilver
источник
Вы используете последнюю версию iOS 7? Некоторые из этих ТИПОВ несоответствий (но не все, и, возможно, не этот) были исправлены во время более поздних предварительных просмотров. Я должен знать: я откладывал так много, что некоторые проблемы исчезли.
Дэн Розенстарк
Проверьте ответ здесь - stackoverflow.com/a/18986158/1463604
Nishant
Короткий ответ заключается в том, что это дополнительное заполнение, вероятно, происходит из-за заголовка табличного представления (не заголовка раздела), и UITableViewему не нравится, когда ему присваивается заголовок с высотой 0,0. Проверьте stackoverflow.com/a/31223403/1394534 для получения дополнительной информации.
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];примечание: 0.0fпросто игнорируется, если вы используете его в высоте прямоугольника. Поэтому мы используем CGFloat, близкий к нулю (по крайней мере, это «сработало» для меня ... просто не идеальное решение).
Алехандро Иван
1
@ AlejandroIván твой комментарий только что сделал мою ночь. У меня есть tableView с сгруппированными прототипами. Я использую numberSections = data.count и настройку numberRows = 1. Я установил heightForFooterInSection, чтобы между ними было чистое пространство, и по какой-то причине появился пустой tableHeaderView.
Райан Александр

Ответы:

863

Мне помогло следующее:

YouStoryboard.storyboard> YouViewController> Инспектор атрибутов> Снять отметку - настроить вставки вида прокрутки.

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

Александр
источник
42
Я думаю, что это правильный способ удаления этого отступа, вместо того, чтобы вмешиваться в значения edgeInset.
Hgeg
21
Это не сработало для меня - у меня есть непрозрачный navBar выше, и это отключено толкает контент под ним.
Slycrel
5
Не работает при использовании кастома collectionview. (Когда столик находится внутри collectionviewcell)
Акшит Завери
5
Не работал для меня; Единственное, что сработало, это переключение на Plain вместо Grouped
shim
28
У меня была эта проблема с TableViewController внутри представления контейнера. Я должен был установить это свойство не непосредственно на TableViewController, который был встроен, а на контроллере представления, который содержал контейнерное представление. Тогда это сработало.
Энди Мортимер
326

Я поэкспериментировал с этим немного больше, и, похоже, это побочный эффект установки tableView tableHeaderView = nil.

Поскольку у моего tableView есть динамически появляющееся tableHeaderView, когда мне нужно скрыть tableHeaderView, вместо того, чтобы делать self.tableView.tableHeaderView = nil;, я делаю:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Мне нравится это решение лучше, чем установка произвольного, contentInset.topпотому что я использую и contentInset.topдинамически. Необходимость помнить об удалении лишних 35 пикселей каждый раз, когда я пересчитываю contentInset.top, утомительна.

Мистер Т
источник
4
Отличное решение! Действительно, вы должны установить его на 0.01f, чтобы избавиться от представления заголовка табличного представления по умолчанию, как в вашем коде.
Симона Манганелли
2
Кстати, это также возможно сделать одним перетаскиванием в Интерфейсном Разработчике. В любом случае, спасибо! :)
Рудольф Адамкович
8
Вы, сэр, заслуживаете медали за это
Вайбхав Гаутам
7
Имейте в виду, что представление высоты 0,01f в верхней части представления таблицы будет означать, что все ячейки beaneath смещены (первая ячейка имеет начало Y, равное 0,01, следующая ячейка cell_height + 0,01 и т. Д.), Поэтому содержимое этих ячеек будет смещен. (Включите Debug > Color Misaligned Imagesсимулятор, чтобы убедиться в этом.) Вы не хотите этого делать.
Саймон Уитакер
2
Лучше использовать UITableViewHeaderFooterViewвместо UIView. И CGFLOAT_MINработает так же, как и 0.01fлучше в теории.
Джейбо
178

Для IOS 7, если вы выделяете табличное представление в контроллере представления, вы можете посмотреть в

self.edgesForExtendedLayout = UIRectEdgeNone;

ваша проблема казалась похожей на мою

Обновить:

Swift в iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Свифт 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
источник
3
Работал на моей равнине UITableView. Проблемы связаны с тем фактом, что my UITableViewнаходился UIViewControllerвнутри a, в результате UINavigationControllerчего содержание таблицы упало на 44 пункта, поэтому исходное содержимое не отставало от navBar. Это не было необходимо с моим макетом, так что это просто вызвало проблемы. В конце концов я изменил свой код, automaticallyAdjustsScrollViewInsetsкоторый работал также.
DBD
Это свойство применяется только для просмотра контроллеров, встроенных в контейнер, такой как UINavigationController. Контроллер корневого представления окна не реагирует на это свойство. Значением по умолчанию этого свойства является all. ..Я чувствую, что по умолчанию должно быть 0? Где это имеет преимущество.
Desh_
5
Более элегантно с Swift 3:edgesForExtendedLayout = []
Дэйв Баттон
Здравствуйте @yeahdixon Какое программное обеспечение вы используете, чтобы сделать розовую стрелу? заранее спасибо
iArezki
175

Попробуйте изменить contentInsetсвойство, которое UITableViewнаследуется от UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

Это обходной путь, но он работает

nvrtd первый
источник
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);работал лучше всего для меня, потому что было 20 дополнительных пикселей сверху и снизу.
Брайан
1
Хотя это решение "грубой силы" работает, я думаю, что нижние (в частности, автоматически настраиваемые вставки) должны оцениваться выше.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

попробуйте, вы можете справиться с этим!

guanhuiwit
источник
Это прекрасно работает, чтобы скрыть tableHeaderView в iOS 7.0, но он не поддерживается в более старых версиях.
Брайан
Прекрасно работает под iOS 7.
StackRunner
3
Важное замечание: Убедитесь, что вы делаете это в контроллере представления контейнера, если ваш UITableView размещен на контроллере, который затем внедряется в другой контроллер, сделайте это в верхнем контроллере встраивания, а не в тот, в который вы положили UITableView (где AutoLayout будет береги вещи).
Джеймс Стоун
Это лучше чем uncheck Adjust scroll view insets. Потому что иногда мы не используем раскадровку для создания нашего пользовательского интерфейса.
JW.ZG
Это работает для меня. Я прикрепил вид к панели навигации и к табличному виду, это не произошло в iOS 11, но это происходит в iOS 10. Спасибо.
Добихо
78

Вы можете определить, работает ли ваше приложение на iOS7 или выше, и добавить эти два метода в ваш делегат табличного представления (обычно в коде UIViewController).

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Возможно, это не элегантное решение, но у меня работает

Swift версия:

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

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
Светлый человек
источник
1
Это сработало для меня. UITableView добавляет место сверху по многим различным причинам. В частности, что касается OP, проблема возникает только для таблицы сгруппированных стилей. И это решение решило проблему.
RajV
5
Вы можете использовать CGFLOAT_MIN вместо 0,001, это дает вам наименьшее абсолютное значение CGFloat.
eiKatte
2
Это правильный ответ, поскольку реальная особенность заключается в том, что отступы присутствуют только в представлении таблицы сгруппированных стилей и игнорируются, если вы задаете верхний / нижний колонтитулы
Jakub Truhlář
Это должно быть помечено как правильный ответ. Метод делегата для переопределения, и он отвечает на вопрос. По крайней мере, попробуйте сначала, если вы прочитали это все хаки. Попробуйте написать: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) section {// return CGFLOAT_MIN; возврат 30.0f; }
Мэтью Фергюсон
Ницца! В качестве бонуса, если вам нужен маленький верхний колонтитул и больше между сгруппированными разделами, вы можете использовать следующее:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

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

Начиная с iOS7, если вы создаете UITableView со стилем «Сгруппированный», но не имеете делегата, установленного в первом макете, тогда вы устанавливаете делегат и вызываете reloadData, в верхней части будет пространство размером 35px, которое никогда не исчезнет.

Посмотрите этот проект, который я сделал, демонстрируя ошибку: https://github.com/esilverberg/TableViewDelayedDelegateBug

В частности, этот файл: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Если линия 24 активна,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

наверху будет дополнительное пространство 35 пикселей. Если строка 27 активна, а 24 закомментирована,

self.tableView.delegate = self;

нет места сверху. Как будто tableView где-то кэширует результат, а не перерисовывает себя после того, как делегат установлен и вызывается reloadData.

esilver
источник
21
Я хотел бы добавить, что даже если есть делегат, но делегат tableView:heightForHeaderInSection:и tableView:heightForFooterInSection:возвращает 0, у вас также будет эта проблема. Реализация описанных выше методов протокола и возвращение 0.01f исправили это для меня.
Джон Эстропия
1
ДА!! Я попробовал 3 так называемых решения, и это было одно! Блестяще, спасибо: D
Хенрик Эрландссон
идеально. Любой сообщил об ошибке, потому что я думаю, что это не предполагаемое поведение.
Pushparaj
отличная находка! Это все еще происходит в ios 9 (мы не используем XIB), но установка делегата на init исправила интервал (не в loadView или viewDIdLoad). Спасибо!
Джон Стрикер
1
Мне помогла установка расчетной высоты для заголовка
Виктор
49

Снимите флажок «Настроить вкладки прокрутки»

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

Tú Đt
источник
Мне нужна была эта опция для другого моего View Controller, и, очевидно, когда я сделал новый VC, изменения были перенесены. Спасибо за это!
Дэвид
Да! Работает, просто установите его в ContainerView и работайте!
Felipe FMMobile
46

Еще один быстрый комментарий ... даже в XCode 6.1 есть ошибка с вертикальными пробелами, появляющимися вверху UIScrollViews,UITextViews и UITableViews.

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

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

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

(Моя благодарность Одеду за то, что он указал мне в этом направлении ... Я публикую этот комментарий, просто чтобы добавить несколько скриншотов, чтобы продемонстрировать симптомы и исправить.)

Майк Гледхилл
источник
1
Обратите внимание, что эта ошибка, errrr, проблема также возникает в iOS 8, если у вас есть UITextView в качестве первого элемента управления на вашей странице ... так что это не просто проблема UITableView.
Майк Гледхилл
1
Из всех решений у меня работал только этот взлом. Странное исправление странной ошибки. Я столкнулся с этой проблемой с UITableview.
Месба
4
1 миллион спасибо! Это единственное решение, которое сработало для меня.
user139816
1
(Я поражен тем, что прошло 18 месяцев, и читатели все еще голосуют за этот ответ. Неужели Apple серьезно еще не исправила эту проблему?!)
Майк Гледхилл,
1
спас мою жизнь! Спасибо. Вы знаете, сколько времени понадобилось, чтобы найти это простое маленькое «исправление»? grrh.
Mc.Stever
40

Согласно этому руководству по переходу для iOS7 от Apple, вставки содержимого представления прокрутки автоматически настраиваются. Значение по умолчанию автоматически AdjustsScrollViewInsets набора параметров AdjustsScrollViewInsets установлено в YES.

UIViewController, который имеет UITableView, должен установить это свойство в NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Это сделает свое дело.

РЕДАКТИРОВАТЬ 1:

Также можно попробовать -

self.navigationController.navigationBar.translucent = YES;

Это также удаляет лишнюю прокладку сверху.

girish_vr
источник
Очень хороший ответ, если он не совсем отвечает на вопрос. Esilver говорит о разрыве в 35px, но iOS7 добавляет дополнительный заголовок 20px: равный высоте строки состояния.
Мартин
Смешная проблема. Спасибо за ответ.
Генки
Это ответ на другую проблему.
энтонио
Спасибо, это сработало для меня, в моем конкретном случае у меня был встроенный в viewcontroller контроллер viewview, и, установив автоматически adjustsScrollViewInsets = false в viewcontroller, верхний пробел исчез
Алексей
39

При использовании сгруппированного TableView используйте это, чтобы избежать срезания границ в viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Акиб Мумтаз
источник
Перепробовал все остальные. Это тот, который работал! Спасибо
Майкл
36

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

Корень проблемы:

  1. a UITableViewне любит иметь заголовок с высотой 0.0. Если то, что вы пытаетесь сделать, это иметь заголовок с высотой 0, вы можете перейти к решению.

  2. даже если позже вы назначите для заголовка не 0,0 высоту, a UITableViewне любит, когда сначала присваивается заголовок с высотой 0,0.

Решение:

Затем самое простое и надежное исправление - убедиться, что высота заголовка не равна 0, когда вы присваиваете его представлению таблицы.

Примерно так будет работать:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Нечто подобное может привести к проблеме в какой-то момент (обычно после прокрутки):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Аурелиен Порт
источник
Наконец-то я нашел ответ, который работает. Спасибо. Кроме того, я узнал, что tableView.tableHeaderViewна самом деле это дополнительное представление над содержимым строки. Меня все время путали с заголовками разделов, пока не вышел ваш ответ.
Джо Хуан,
1
CGFLOAT_MINбыл заменен на CGFloat.leastNormalMagnitudeв Swift 3
Клэй Эллис
29

Раскадровка:

Просто снимите флажок: Adjust Scroll View Insetsв настройках View Controller

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

Код:

self.automaticallyAdjustsScrollViewInsets = false
Бартломей Семанчик
источник
2
используя xcode 7, я не вижу инспектора атрибутов> Layout, куда я должен добавить self.automaticsAdjustsScrollViewInsets = false
alex
ввиду загрузил.
CW0007007
23

Это решение для iOS 10 с использованием Swift 3:

Вы можете избавиться от верхнего и нижнего отступов, реализовав следующие методы из UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
источник
Вторая страница на SO помогла мне .... Я не знаю, почему, может быть, из-за AutomaticDimension, может быть, из-за ограничений с VFL, в любом случае, спасибо! Ози Буа Ист Брав! : D
Pentarex
Это верхние и нижние колонтитулы раздела . Вопрос касается всего заголовка таблицы. Кроме того, нет ничего специфического для Swift3 или iOS 10 ни в одном методе делегата (они существуют всегда).
Николас Миари
14

В моем случае это было то, что мне помогло. Я также поддерживаю ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
источник
Не уверен, что это делает, но это сработало отлично. Не могли бы вы дать какое-то объяснение?
Мэтт Вулф
@MattWolfe Я был потерян и нашел это решение, не зная, почему это происходит. Я предполагаю, что контроллер решает, что табличному представлению нужна вставка из-за строки состояния (или в других случаях панели инструментов / вкладок), поэтому он автоматически добавляет ее. Я действительно борюсь с некоторыми из новых функций iOS7. Может, кто-то это понимает и имеет реальное объяснение этому?
Лукас
Потратил последние 2 дня на портирование сравнительно небольшого приложения на iOS 7 и все еще с небольшими проблемами .. Я исправляю это в ios 7, он ломается на 6 и наоборот .. сводит меня с ума!
Мэтт Вулф
Это другая проблема, чем ОП. Даже при этом для сгруппированного табличного представления сверху добавляется дополнительное пространство.
RajV
1
это, кажется, ключевая строка: self.automaticsAdjustsScrollViewInsets = NO; просто установка, которая убрала лишнее пространство, которое у меня было.
Майк М
14

Просто добавьте следующее в viewDidLoad в вашем VC:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
источник
Это исправление сработало, и я предпочитаю вручную устанавливать вкладки, используя магические числа. Спасибо!
иммобилайзер
14

Так что я пробовал все методы здесь, и на этот раз ни один из них не помог. Мой случай был сгруппированным табличным представлением на iOS 9. Я действительно не знаю, почему и как я узнал это, но для меня сработала настройка tableViewHeaderс UIViewпо крайней мере 0.01высотой. CGRectZeroне помогло, ничего не помогло

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
источник
10

Swift: iOS У меня был вид таблицы в виде прокрутки ... когда я нажимал "Назад" на том же экране. Вид прокрутки занимает больше места сверху ... для решения этой проблемы я использовал:

 self.automaticallyAdjustsScrollViewInsets = false

Логическое значение, которое указывает, должен ли контроллер представления автоматически корректировать свои вставки представления прокрутки. Значение по умолчанию - true, что позволяет контроллеру представления корректировать его вставки представления прокрутки в ответ на области экрана, занятые строкой состояния, панелью навигации, а также панелью инструментов или панелью вкладок. Установите значение false, если вы хотите самостоятельно управлять настройками вставки вида прокрутки, например, когда в иерархии представлений имеется более одного прокрутки.

Винод Джоши
источник
10

Благодаря ответу @Aurelien Porte. Вот мое решение

Причина этой проблемы: -

  1. UITableView не любит иметь заголовок с высотой 0.0. Если то, что вы пытаетесь сделать, это иметь заголовок с высотой 0, вы можете перейти к решению.
  2. даже если позже вы назначите для заголовка не 0,0 высоту, UITableView не хочет, чтобы сначала был назначен заголовок с высотой 0,0.

В ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Не нужно что-то вроде этого: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

В heightForHeaderInSectionделегате: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

В viewForHeaderInSectionделегате: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
Ашиш Писей
источник
10

Вот как это можно легко исправить в iOS 11 и Xcode 9.1 через раскадровку:

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

Саид Ир
источник
1
Работал для меня :)
bhupinder
Большой! Спасибо :)
Саид Ир
1
Это вместо automaticallyAdjustsScrollViewInsetsios 11
Ник Ков
9

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

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

Для поиска по всем подпредставлениям (я бы запустил этот код, когда в таблице нет ячеек, чтобы было легче читать вывод):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
Kevin
источник
3
Если UITableViews (чтобы быть более конкретным UITableViewCellScrollView) на iOS7 научили нас одной вещи, это оставить иерархию представлений только для встроенных классов.
Матиас Баух
Хорошая точка зрения. Другой вариант ... продолжать взламывать каждую iOS;)
Дэн Розенстарк,
Ой, да. Имел в виду написать это предупреждение, но забыл.
Кевин
Кевин - Я думаю, что вы правы, это умышленно. Похоже, что возвращение 0 для heightForHeaderInSection - самый простой способ удалить это заполнение. По какой-то причине в этом конкретном случае он не работал для меня, но он работает на других UITableView.
Esilver
1
Это определенно "по замыслу". Если вы приостановили выполнение и запустили: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]вы увидите, что заголовок таблицы, или заголовок первого раздела, или первая ячейка (в зависимости от того, что вы используете) естественно оставляют границу 35px .... boo.
Мистер Т
9

Мой ответ будет более общим, но может быть применен и к этому.

Если корневое представление ( ViewController ) или первый дочерний элемент ( подпредставление ) корневого представления является подклассом UIScrollView (или самого UIScrollView), и если

self.navigationController.navigationBar.translucent = YES;

Фреймворк автоматически установит предварительно рассчитанный контентInset .


Чтобы избежать этого вы можете сделать

self.automaticallyAdjustsScrollViewInsets = NO;

но в моем случае я не смог этого сделать, потому что я реализовывал SDK, который имеет компонент UIView, который может использоваться другими разработчиками. Этот компонент UIView содержит UIWebView (который имеет UIScrollView в качестве первого подпредставления). Если этот компонент добавлен как первый дочерний элемент в иерархии представления UIViewController, автоматические вставки будут применены системой.

Я исправил это, добавив фиктивный вид с рамкой (0,0,0,0) перед добавлением UIWebView.

В этом случае система не нашла подкласс UIScrollView в качестве первого подпредставления и не применила вставки

zvjerka24
источник
livesaver! спасибоself.automaticallyAdjustsScrollViewInsets = false
этаннеф
8

Этот код работал для меня, лучший ответ для меня, который был написан в objective-Cверхней части, поэтому я преобразовал его в Swift.

Для Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Просто запишите это, viewDidLoad()и это будет работать как шарм.

Випул Кумар
источник
1
Большое спасибо, отлично сработало для меня.
Анджело Полотто
1
Добро пожаловать счастливого кодирования
Vipul Kumar
7

У меня было такое же исправление, как у ариелиза. Как только я переместил UITableView, чтобы он не был первым подпредставлением родительского представления, он исчез. Мое пространство было 20 пикселей, а не 35.

Я не смог воссоздать его в портретной графике, только в альбомной графике. Я опубликую ошибку радара позже, если смогу воспроизвести ее в простом демонстрационном приложении.

Одед
источник
Столкнулся с той же проблемой, но не смог решить ее, изменив contentInset, но этот метод работал, хотя он довольно хакерский. Что бы это ни стоило, используя инструмент визуальной отладки, я смог увидеть, что, хотя UITableView имеет правильную высоту, UITableViewWrapper внутри него нет.
Mic Fok
Отлично. Это исправило ошибку для меня, в XCode 6.1. Ни одно из других предложений на этой странице StackOverflow не имело никакого значения. У меня был UITableView в UIView, и это было первое подпредставление. Перетаскивание, чтобы стать вторым подпредставлением исправило это отлично (Если я кому-нибудь понадоблюсь, я буду в пабе.)
Майк Гледхилл
Спасибо! Это также работает, если у вас есть контроллер табличного представления в контейнере. Перемещение контейнера таким образом, чтобы он не был первым в родительском представлении, устраняет пробел в верхней части табличного представления.
чудак
7

Я думаю, что создание UIEdgeInsets -35 0 0 0 утомительно. В моем случае я реализовал tableView: heightForHeaderInSection: метод, и он может возвращать 0.

Когда я изменил 0 на 0.1f, проблема просто исчезла.

Цзянфань Ду
источник
1
Если бы я мог, я бы проголосовал за это не раз. Должно быть странный глюк автопутешествия или что-то в этом роде ... Поскольку все> 0 работает, я предлагаю вместо 0.1 использовать FLT_EPSILON или DBL_EPSILON, поскольку оба представляют минимальное положительное значение, такое как 1.0 + epsilon! = 1.0
Анри Нормак,
7

Единственное, что сработало для меня, было:

Свифт :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Цель-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Кроме того, у меня все еще было дополнительное место для первого раздела. Это потому, что я tableHeaderViewнеправильно использовал собственность. Исправлено это также добавлением:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Данут Пралеа
источник
У меня работает на Swift 4.2. Спасибо
Сайлар
Перепробовал все на этой странице, для iOS13 сгруппировал табличное представление с представлением заголовка. self.tableView.tableHeaderView = UIView (frame: CGRect (x: 0, y: 0, width: tableView.frame.size.width, height: 0.01)). исправил проблему.
Нин,
7

Код Swift 4: для таблицы без заголовков разделов вы можете добавить этот код:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

и вы получите интервал заголовка до 0.

Если вы хотите заголовок вашей конкретной высоты, передайте это значение:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

и представление от viewForHeaderinSection делегата.

Keerthana Manoharan
источник
Это не отвечает на вопрос. Вопрос был в том, откуда берется дополнительный интервал, а не в том, как от него избавиться.
Стивен Ньюэлл
странно то, что если вы вернете 0 в heightForHeaderInsection, вы все равно получите этот дополнительный пробел. Он отлично работает с CGFloat.leastNormalMagnitude (наименее положительное число)
ShadeToD
7

Чтобы быть определенным, чтобы удалить пространство tableviewHeader сверху, я сделал эти изменения:

YouStoryboard.storyboard> YouViewController> Выберите «TableView»> «Инспектор размеров»> «Вставки содержимого» - установите для него значение «никогда».

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

user832
источник
Какая дополнительная информация, кроме скриншота, по сравнению с этим ответом ?
Artjom B.
это то же самое, я думаю, я не нашел этот ответ, когда искал решение. Должен ли я удалить свой ответ тогда?
user832
Нет, если вы можете немного расширить свой ответ, объяснив, почему Content Ints = Никогда фактически не решает эту проблему (как работает эта опция?).
Artjom B.
Если для вставок содержимого задано значение «никогда», tableView не будет прокручиваться вверх при редактировании textField.
Мойтаба аль-Муссави
6

используйте это, я думаю, это поможет ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Шахзаиб Макбул
источник
1
Brilliant! Работает как шарм в iOS 9.2. Этот ответ идеален, поскольку в некоторых случаях мне нужно подавить первый заголовок, а в других показать его. Я видел другой ответ, используя CGFloat.min, который тоже работает. Так что мой viewController теперь может предоставлять либо действительное число, например 44.0, либо, по существу, 0.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
источник
automaticAdjustsScrollViewInsets = ложная работа от меня! Спасибо!
Даниэль Кута