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

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

Вот пример:

enter image description here

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

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


Примечание:

В современной iOS:

tableView.contentInsetAdjustmentBehavior = .never

Ответ 1

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

Как и в iOS7, если вы создаете UITableView со стилем Grouped, но у вас нет набора делегатов на первом макете, тогда вы установите делегат и вызовите 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 px пространство. Если строка 27 активна и 24 закомментирован,

self.tableView.delegate = self;

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

Ответ 2

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

YouStoryboard.storyboard > YouViewController > Инспектор атрибутов > Снимите флажок - Отрегулируйте вставки прокрутки.

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

Ответ 3

Я играл с ним немного больше, и похоже, что это побочный эффект настройки 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 динамически. Не забудьте удалить лишние 35px, когда я пересчитываю contentInset.top, утомительно.

Ответ 4

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

Обновление:

Swift в iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

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

Ответ 5

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

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

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

Ответ 6

self.automaticallyAdjustsScrollViewInsets = NO;

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

enter image description here

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

enter image description here

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

Ответ 10

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

UIViewController с UITableView должен установить для этого свойства значение NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Это сделает трюк.

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

Кроме того, можно попробовать -

self.navigationController.navigationBar.translucent = YES;

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

Ответ 11

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

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

Ответ 12

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

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

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

  • даже если позже вы назначаете высоту не 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;

Ответ 13

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

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

enter image description here

Код:

self.automaticallyAdjustsScrollViewInsets = false

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

self.automaticallyAdjustsScrollViewInsets = NO;

Ответ 17

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

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

Ответ 18

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

 self.automaticallyAdjustsScrollViewInsets = false

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

Ответ 19

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

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

  • UITableView не любит иметь заголовок с высотой 0.0. Если то, что вы пытаетесь сделать, это иметь заголовок с высотой 0, вы можете перейти к решению.
  • даже если позже вы назначаете высоту не 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 
}

Ответ 20

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

Если это пространство представлено символом 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];
    }
}

Ответ 21

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

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

self.navigationController.navigationBar.translucent = YES;

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


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

self.automaticallyAdjustsScrollViewInsets = NO;

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

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

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

Ответ 22

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

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

Ответ 23

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

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

Ответ 24

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

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

Ответ 25

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

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

Ответ 26

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

 //  OR

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

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

Ответ 27

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

Swift

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))

Ответ 28

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

1) Вы можете добавить UIImageview в view 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)];

Ответ 29

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

Ответ 30

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

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

enter image description here