it-swarm.com.ru

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

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

Вот пример:

enter image description here

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

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

587
esilver

Я нашел причину моей первоначальной ошибки и создал демонстрационный проект, демонстрирующий ее. Я считаю, что есть ошибка 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. 

52
esilver

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

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

 enter image description here

852
Alexander

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

Поскольку у моего 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, утомительна. 

296
Mr. T

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

Обновление:  

Swift в iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Свифт 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
174
yeahdixon

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

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

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

159
nvrtd frst
self.automaticallyAdjustsScrollViewInsets = NO;

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

132
guanhuiwit

Вы можете определить, работает ли ваше приложение на 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
}
66
LightMan

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

 enter image description here

49
Tú Đt

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

enter image description here

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

enter image description here

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

45
Mike Gledhill

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

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

self.automaticallyAdjustsScrollViewInsets = NO;

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

Правка 1: 

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

self.navigationController.navigationBar.translucent = YES;

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

39
girish_vr

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

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
37
Aqib Mumtaz

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

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

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

  2. даже если позже вы назначите для заголовка не 0,0 высоту, 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;
33
Aurelien Porte

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

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

enter image description here

Код:

self.automaticallyAdjustsScrollViewInsets = false
29
Bartłomiej Semańczyk

Это решение для 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
}
18
AndreasLukas

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

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
14
Lukas

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

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
14
sunshinejr

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

self.automaticallyAdjustsScrollViewInsets = NO;
14
judepereira

Благодаря ответу @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
Ashish Pisey

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

 self.automaticallyAdjustsScrollViewInsets = false

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

10
Vinod Joshi

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

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

self.navigationController.navigationBar.translucent = YES;

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


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

self.automaticallyAdjustsScrollViewInsets = NO;

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

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

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

9
zvjerka24

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

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

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

- (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];
    }
}
8
Kevin

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

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

8
Pink Panther

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

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

7
Jiangfan Du

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

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

7
Oded
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

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

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
6
A.G

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

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

 enter image description here

6
user832

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

Свифт :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objective-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))
6
Danut Pralea

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

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
6
Shahzaib Maqbool
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

Это все, ребята!

5
Hannah Louisa Carney

У нас есть несколько ответов на это.

1) Вы можете добавить UIImageview при просмотре didload

UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];

2) Вы можете установить высоту верхнего и нижнего колонтитула 0,1

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

3) Вы можете добавить верхний и нижний колонтитул с высотой 0,1

tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
5
Hari c

Я тоже бился головой об этом. Я уверен, что это ошибка iOS7 .... Что мне в итоге помогло, так это порядок просмотров в xib. У меня было одно представление, в котором табличное представление отображалось правильно, и другое, в котором представление таблицы имело это дополнительное пространство 35px. Единственное отличие между ними (UITableView) в том, что в представлении с плохим отображением UITableView был первым дочерним элементом, тогда как в представлении, которое отображалось правильно, это был второй. 

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

4
arielyz

Просто прикрепите свое табличное представление (или сделайте так, чтобы оно началось) в абсолютной верхней части представления. Дополнительное нежелательное пространство - это точно высота панели навигации.

4
latenitecoder
tableView.contentInsetAdjustmentBehavior = .never

было решение для меня (iOS12/Xcode 10) на простом табличном представлении с заголовками

3
david

Выполнение ниже (Swift) решает проблему, но это работает, когда вам не нужен заголовок.

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

Если вы это сделаете, вам придется отказаться от самого первого раздела и использовать другие для контента.

UITableViewDataSource реализация:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return <number_of_data_sections>+1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // the first section we don't use for data
    if section == 0 {
        return 0
    }

    // starting from 1, there are sections we use
    if section == 1 { 
        let dataSection = section - 1

        // use dataSection for your content (useful, when data provided by fetched result controller). For example:
       if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
            return sectionInfo.numberOfObjects
        }
    }

    return 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
    // return cell using transformed dataIndexPath
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 1 {
        // return your header height
    }
    return CGFloat.min
}


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 1 {
        // return your header view
    }
    return nil
}

func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    // in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
    return CGFloat.min
}

И это все. Модель не знает ничего об изменении, потому что мы преобразовываем номер раздела при доступе к данным.

3
Yevhen Dubinin

Я только что удалил UITableView из Interface Builder, создал его еще раз и странные 35px исчезли.

Похоже, это странная ошибка в Interface Builder.

3
LorikMalorik

если вы выбираете стиль UITableViewStyleGrouped, вам нужно реализовать метод делегата высоты Header и Footer, и возвращаемое значение должно быть больше 0; как это:

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

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

Когда вам нужно скрыть tableHeaderView, вы должны использовать этот код Swift 3:

tableView.tableHeaderView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))
2
Vladislav Stanishevsky

С раскадровкой:

Убедитесь, что в вашем верхнем ограничении UITableView не написано «Под верхним руководством по макету». Вместо этого следует сказать «Top space to: Superview» (Superview.Top).

Плюс, конечно, в UIViewController, который содержит UITableView, снимите флажок «Настроить вставки вида прокрутки».

2
konsti

Код 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 делегата.

2
keerthana manoharan

self.automaticallyAdjustsScrollViewInsets = NO;

Это не рекомендуется в iOS 11, поэтому вы должны использовать новое свойство contentInsetAdjustmentBehavior в вашем коде, это должно решить проблему.

if #available(iOS 11.0, *) {
    collectionView.contentInsetAdjustmentBehavior = .never
}

В iOS 11 добавлено новое свойство UIScrollView с именем contentInsetAdjustmentBehavior, позволяющее определить смещение содержимого

2
Aks

У меня есть VC с контейнером в нем (который, кстати, является частью контроллера Nav), и встроенным в него является TableVC.

Выбор моего TableVC, глядя на панель атрибутов:

  • снимите флажок автоматически настраивать вкладки прокрутки
  • снимите флажок выдвигать края под верхней панелью

Затем я установил автоограничение для Контейнера относительно родительского представления как:

Контейнер View.top = ParentView.Top Margin

Это делает для меня следующее:

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

Много проб и ошибок для меня с этой настройкой, но я в конечном итоге обнаружил, что эти маленькие детали опубликованы lekksi @ Удалить пустое пространство перед ячейками в UITableView

2
the_dude_abides

Я не уверен, что это хороший ответ, но он работает со мной

Я выбираю Table View, перехожу к линейке, меняю значение Y на ноль 

 enter image description here

1
Mina Fawzy

Я заметил, что есть много ответов на этот вопрос в зависимости от того, что вы пытаетесь сделать, поэтому я бы поделился своим, если кто-то собирается добиться такого же эффекта:

enter image description here

В моем контроллере просмотра у меня есть сгруппированная UITableView, чья tableHeaderView состоит из UIScrollView высотой 200 пунктов и одного атрибутного UILabel, который содержит заголовок объявления, цену, местоположение и время публикации. Ниже это содержание табличного представления.

При значениях по умолчанию для заголовка сгруппированного табличного представления заголовок «ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ» находится слишком далеко под меткой «5 дней назад». Я исправил это (уже вышеприведенное изображение), переопределив высоту верхнего и нижнего колонтитула каждого раздела.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}

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

О переопределении высот я узнал из комментария @ erurainon в принятом ответе и UITableViewAutomaticDimension из https://stackoverflow.com/a/14404104/855680 . Мне не нужно было устанавливать self.automaticallyAdjustsScrollViewInsets в NO в моем контроллере представления в отличие от того, что предлагает принятый ответ.

Я также уже пытался установить UIEdgeInsets и присвоить табличному представлению отрицательное значение для вершины, но это не сработало - все табличное представление перемещается вверх, включая tableHeaderView.

1
Matthew Quiros

Убедитесь, что вы дали ограничения для таблицы. Я не сталкивался с подобной проблемой необъяснимого заполнения в нижней части стола.

1
Yash Tamakuwala

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

self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0

Кроме того, проблема не происходила в верхней части tableView. Это происходило в верхней части каждого раздела таблицы.

FWIW эта проблема происходила только для iOS9. Наше приложение отлично работало для iOS10 и iOS 11.

Я настоятельно рекомендую вам увидеть этот удивительный вопрос и ответы на него: 

Использование Auto Layout в UITableView для динамического размещения ячеек и переменной высоты строк

1
Honey

В моем случае была лишняя ячейка под названием «HeaderView» для визуализации прототипа в раскадровке, когда я ее удалил, все было хорошо.

1
Robert Juz

Swift3

  If you are using grouped table then do following things .
  This will remove top space.
    var frame = CGRect.zero
    frame.size.height = .leastNormalMagnitude
    self.tableView.tableHeaderView = UIView(frame: frame)
    self.tableView.tableFooterView = UIView(frame: frame)
If you Still getting this issue then it will remove by default content offset from top.
 [Set content insets never]          

https://i.stack.imgur.com/fjxOV.png

0
Narendra Prajapati

Наконец-то понял, как это исправить, попробовав все!

Я заметил, что по какой-то причине для contentOffset моего табличного представления было 'y' -20, поэтому при настройке моего табличного представления: Swift 3/4

tableView.contentOffset = .zero

Objective-C

self.tableView.contentOffset = CGPointMake(0, 44);
0
Jason Silver

Использование Swift 4.1. Попробуй это: 

func tableView(_ tableView: UITableView, viewForHeaderInSection 
section: Int) -> UIView? {
    return nil 
}
0
ali ziwa

в iOS 7 вы видите, что начинает экран, а не под navBar. очень просто установить это в нижней части вашего navbar. Проверьте ЭТОТ ответ для решения, это не тот же вопрос, но очень связанный с вашим.

0
MQoder

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

В таблице UITableViewStyleGrouped (статической или динамической) просто назначьте нужную высоту в tableView(_:heightForHeaderInSection). Я рассчитываю новую высоту на основе нижнего отступа для метки заголовка раздела.

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

    var height = UITableViewAutomaticDimension

    if section == 0, let header = tableView.headerViewForSection(section) {
        if let label = header.textLabel {
            // get padding below label
            let bottomPadding = header.frame.height - label.frame.Origin.y - label.frame.height
            // use it as top padding
            height = label.frame.height + (2 * bottomPadding)
        }
    }

    return height
}

Протестировано на iOS 9, Xcode 7.3.

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

0
maganap

Этот код работал для меня, лучший ответ для меня, который был написан на 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(), и он будет работать как чемпион.

0
Vipul Kumar

Ни один из предыдущих ответов не работал для меня. Что в итоге сработало для моей ситуации (когда после динамического добавления заголовка в мой Table View было выбрано заполнение), я выбрал Navigation Bar из Document Outline и перепроверил поле Translucent (в отличие от некоторых ответов, в которых говорилось, что он должен быть прозрачным) , Ранее я не проверял его, потому что он сделал мой красный цвет немного оранжевым, но я не мог попробовать решение переупорядочения элементов в сцене, так как Table View был единственным элементом в этой сцене. Это решение работает до тех пор, пока у вас все в порядке с цветом Navigation Bar, имеющим прозрачный слой поверх него. Надеюсь это поможет :)

0
jeff t

Для меня я попробовал все решения, но я думал установить высоту для раздела UITableView, и он работает для меня. (Использование Swift )

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0.001
    }
0
Mr.Javed Multani
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 0.0
}

Это сработало для меня. Также можно дать высоту для заголовка на основе раздела.

0
vsujan