Чому у верхній частині мого UITableView в стилі UITableViewStyleGrouped в iOS7 є додаткові накладки


635

Починаючи з iOS7, у верхній частині мого додаткового місця UITableViewє стиль UITableViewStyleGrouped.

Ось приклад:

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

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

Хтось може пояснити, звідки береться ця кількість 35 пікселів і як я можу позбутися від неї, не перемикаючись UITableViewStylePlain?


Примітка:

В iOS 11 та новіших версіях:

tableView.contentInsetAdjustmentBehavior = .never

ви використовуєте останню iOS 7? Деякі з цих ВИДІВ невідповідностей (але не всі, а може, і не ця) були виправлені під час подальших попередніх попередніх переглядів. Я повинен знати: я зволікав настільки, що деякі проблеми зникли.
Дан Розенстарк

Перевірте відповідь тут - stackoverflow.com/a/18986158/1463604
Нішант

Коротка відповідь полягає в тому, що це додаткове підкладка, ймовірно, пов’язане із заголовком подання таблиці (а не заголовком розділу), і 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. Я встановлюю висотуForFooterInSection, щоб зробити чистий простір між кожним, і чомусь з’явилася порожня таблицяHeaderView.
Райан Олександр

Відповіді:


863

Мені допомогли наступні:

YouStoryboard.storyboard> YouViewController> Інспектор атрибутів> Зніміть прапорець - Відрегулювати вставки прокрутки для перегляду.

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


42
Я думаю, що це правильний спосіб видалити цю підкладку, а не підробляти значення edgeInset.
Hgeg

21
Це не спрацювало для мене - у мене є непрозорий navBar вгорі, і це вимкнено підштовхує вміст під ним.
slycrel

5
Не працює при користуванні користувачем collectionview. (Коли всередині перегляду столу collectionviewcell)
Акшит Завери

5
Не працювало для мене; Єдине, що спрацювало, було перехід на Plain замість групованого
shim

28
У мене виникла ця проблема з TableViewController всередині подання контейнера. Мені довелося встановити це властивість не безпосередньо на вбудованому TableViewController, а на контролері подання, який містив вигляд контейнера. Тоді це спрацювало.
Енді Мортімер

325

Я пограв з цим трохи більше, і, схоже, це побічний ефект встановлення 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 у верхній частині таблиці перегляду означатиме, що всі клітини, розташовані внизу, нерівні (перша клітинка має походження Y у 0,01, наступна - висота клітини + 0,01 тощо), тому вміст цих комірок буде нерівним. (Увімкніть Debug > Color Misaligned Imagesтренажер, щоб переконатися у цьому.) Ви не хочете цього робити.
Саймон Уітакер

2
Краще використовувати UITableViewHeaderFooterViewзамість UIView. І CGFLOAT_MINпрацює так само, як 0.01fкраще, але теоретично.
Джейбо

178

Для IOS 7, якщо ви виділяєте подання таблиці в контролер подання, ви можете заглянути

self.edgesForExtendedLayout = UIRectEdgeNone;

ваша проблема здавалася схожою на мою

Оновлення:

Швидкий рух в iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Швидкий 3:

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

3
Працював на моїй рівнині UITableView. Проблеми пов'язані з тим, що я UITableViewопинився UIViewControllerвсередині, через UINavigationControllerщо вміст таблиці знизився на 44 бали, тому початковий вміст не відставав від рівня navBar. Це не було потрібно з моєю компонуванням, тому це просто спричинило проблеми. Врешті-решт я змінив свій код, на automaticallyAdjustsScrollViewInsetsякий також працював.
ДБД

Це властивість застосовується лише для перегляду контролерів, які вбудовані в контейнер, такий як UINavigationController. Контролер перегляду кореня вікна не реагує на цю властивість. Значення за цією властивістю за замовчуванням - все. ..Я відчуваю, що за замовчуванням має бути 0? Звідки це перевага.
Деш_

5
Більш елегантний зі Свіфт 3:edgesForExtendedLayout = []
Дейв Баттон

Привіт @yeahdixon Яке програмне забезпечення ви використовуєте для створення рожевої стрілки? заздалегідь
дякую

174

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

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

Це вирішення, але воно працює


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);найкраще працював для мене, оскільки вгорі та внизу було 20 додаткових пікселів.
Брайан

1
Хоча це рішення "грубої сили" працює, я вважаю, що нижні (зокрема автоматичні вставки) повинні бути вищі.
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

спробуйте, ви можете з цим впоратися!


Це чудово працює, щоб приховати tableHeaderView в iOS 7.0, але він не підтримується в старих версіях.
Брайан

Чудово працює під iOS 7.
StackRunner

3
Важливо: Переконайтеся, що ви робите це в контролері перегляду контейнерів, якщо ваш UITableView розміщений на контролері, який потім вбудований в інший контролер, зробіть це у вбудованому верхньому контролері, а не безпосередньо в тому, де ви поставите UITableView (де AutoLayout буде дбати про речі).
Джеймс Стоун

Це краще, ніж uncheck Adjust scroll view insets. Тому що іноді ми не використовуємо табло для створення нашого інтерфейсу.
JW.ZG

Це працює для мене. Я додав перегляд до панелі навігації та перегляду таблиці, це не трапляється в iOS 11, але відбувається в iOS 10. Дякую.
dobiho

78

Ви можете виявити, чи у вашому додатку працює iOS7 або новішої версії, і додати ці два способи в делегат перегляду таблиці (зазвичай у код UIViewController)

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

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

Це, можливо, не елегантне рішення, але працює для мене

Швидка версія:

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
Це правильна відповідь, оскільки справжньою особливістю є те, що накладка є лише у
груповому вигляді

Це слід позначити як правильну відповідь. Делегатний метод перевизначення, і він дає відповідь на питання. Принаймні, спершу спробуйте це, якщо ви прочитали далеко не всі хаки. Спробуйте твіттувати: - (CGFloat) tableView: (UITableView *) висота таблиціView висотаForHeaderInSection: (NSInteger) розділ {// повернути 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, вгорі буде простір у 35 пікселів, який ніколи не зникне.

Дивіться цей проект, з яким я показав помилку: 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.


21
Я додам, що навіть якщо є делегат, але делегат tableView:heightForHeaderInSection:і tableView:heightForFooterInSection:повертає 0, ви також матимете цю проблему. Реалізація методів протоколу вище І повернення 0,01f зафіксувала це для мене.
Джон Естропія

1
ТАК!! Я спробував 3 так званих рішення, і це було одне! Блискуче, дякую: D
Генрік Ерландссон

досконалий. Хтось повідомив про помилку, тому що я думаю, що це не призначена поведінка.
Pushparaj

чудова знахідка! Це все ще відбувається в ios 9 (ми не використовуємо XIB), але встановлення делегата на init фіксує інтервал (не в loadView або viewDIdLoad). Дякую!
Джон Стрікер

1
Налаштування розрахункової висоти для заголовка допомогло мені
Віктор

49

Зніміть прапорець "Налаштувати прокрутки Переглянути вставки"

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


Мені знадобився цей варіант для іншого мого контролера перегляду, і, мабуть, коли я зробив новий VC, зміна перенеслася. Дякую за це!
Девід

Ага! Працює, юсто встановив це в ContainerView і працює!
Феліпе FMMobile

46

Ще один швидкий коментар ... навіть в XCode 6.1, є помилка з вертикальними пробілами , що з'являються у верхній частині UIScrollViews, UITextViewsі UITableViews.

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

Іноді єдиний спосіб виправити цю проблему - зайти в дошку розкадрувань і перетягнути елемент управління проблемою, щоб це не був перший підвід на сторінці.

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

(Дякую Одєду, що вказав на мене в цьому напрямку ... Я публікую цей коментар, лише щоб додати кілька знімків екрана, щоб продемонструвати симптоми та виправити.)


1
Зауважте, що ця помилка, помилка, помилка також трапляється в iOS 8, якщо у вас є UITextView як перший підконтроль на вашій сторінці ... тому це не лише проблема UITableView.
Майк Гледхілл

1
З усього рішення для мене працював лише цей хак. Дивне виправлення дивного помилки. Я зіткнувся з цією проблемою з UITableview.
Месба

4
1 мільйон спасибі! Це єдине рішення, яке працювало для мене.
user139816

1
(Я вражений його 18 місяців пізніше, і читачі все ще голосують за цю відповідь. Чи Apple ще серйозно не вирішила цю проблему ?!)
Майк Гледхілл

1
врятувало мені життя! Дякую. чи знаєте ви, скільки часу знадобилося, щоб знайти це просте маленьке «виправлення»? грр.
Mc.Stever

40

Відповідно до цього посібника з переходу для iOS7 від Apple, вставки вмісту подання прокрутки автоматично коригуються. Значення за замовчуванням автоматичноAdjustsScrollViewInsets встановлено на ТАК.

UIViewController, який має UITableView, повинен встановити це властивість на NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Це зробить трюк.

EDIT 1:

Також можна спробувати -

self.navigationController.navigationBar.translucent = YES;

Це також видаляє зайві накладки на верхній частині.


Дуже гарна відповідь, якщо вона точно не відповідає на питання. Esilver говорить про розрив у 35 пікселів, але iOS7 додає додатковий 20px заголовок: рівний висоті рядка стану.
Мартін

Смішні проблеми. Дякую за відповідь.
Генкі

Це відповідь на іншу проблему.
entonio

Дякую, що це працювало на мене, у моєму конкретному випадку у мене був вбудований контролер табличного перегляду в контролер перегляду, і, встановивши автоматичноAdjustsScrollViewInsets = false у контролері перегляду, верхній проміжок зник
Олексій

39

Під час використання згрупованого TableView використовуйте це, щоб уникнути розрізання меж у viewWillAppear

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

Спробували всі інші. Це той, що працював! Thx
Майкл

36

Дуже багато попередніх відповідей надто хитрі. Вони можуть зламатися в будь-який час у майбутньому, якщо 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;

Нарешті я знайшов відповідь, яка працює. Дякую. Крім того, я дізнався, що tableView.tableHeaderViewнасправді це перегляд аксесуарів над вмістом рядків. Мене весь час плутали із заголовками розділів, поки не з’явилася ваша відповідь.
Джо Хуанг

1
CGFLOAT_MINзамінено CGFloat.leastNormalMagnitudeна Swift 3
Clay Ellis

29

Дошка розкадрувань:

Просто зніміть прапорець: Adjust Scroll View Insetsу параметрах Переглянути контролер

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

Код:

self.automaticallyAdjustsScrollViewInsets = false

2
за допомогою xcode 7 Я не бачу інспектора атрибутів> Макет, куди слід додати self.automaticallyAdjustsScrollViewInsets = 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
}

Друга сторінка на ТА допомогла мені .... Я не знаю чому, може, через AutomaticDimension, може, через обмеження з VFL, як би то не було, дякую! ozi bua ist brav! : D
Пентарекс

Це заголовки та колонтитули секцій . Питання стосується всього заголовка таблиці. Крім того, немає нічого специфічного для Swift3 або iOS 10 в будь-якому способі делегата (вони існують з тих пір).
Nicolas Miari

14

У моєму випадку саме це мені допомогло. Я також підтримую ios6.

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

Не впевнений, що це робить, але це справно працювало. Не могли б ви дати пояснення?
Метт Вулф

@MattWolfe Я розгубився і знайшов це рішення, не знаючи, чому це відбувається. Я гадаю, що контролер вирішує, що для перегляду таблиці потрібна вставка через рядок стану (або в інших випадках панель інструментів / панель вкладок), тому він автоматично додає його. Я дуже бореться з деякими новими "особливостями" iOS7. Може, хтось це розуміє і має на це реальне пояснення?
Лукас

Останні 2 дні витратив на перенесення порівняно невеликого додатка до iOS 7, і все ще виникають незначні проблеми.
Метт Вулф

Це інша проблема, ніж ОП. Навіть при цьому для групового подання таблиці вгорі додається додаткове місце.
RajV

1
це здається ключовим рядком: self.automaticallyAdjustsScrollViewInsets = НІ; просто налаштування, яке видалило зайвий простір у мене.
Майк М

14

Просто додайте до свого viewDidLoad у своєму ВК просто:

self.automaticallyAdjustsScrollViewInsets = NO;

Це виправлення спрацювало, і я вважаю за краще вручну встановлювати вставки, використовуючи магічні числа. Дякую!
іммобілайзер

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

10

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

 self.automaticallyAdjustsScrollViewInsets = false

Булеве значення, яке вказує, чи повинен контролер перегляду автоматично регулювати свої вставки прокрутки. Значення за замовчуванням є істинним, що дозволяє контролеру перегляду коригувати свої вставки перегляду прокрутки у відповідь на області екрану, що споживаються смугою стану, панеллю навігації та панеллю інструментів чи панеллю вкладок. Установіть значення 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 за допомогою Storyboard:

Виберіть Табличний вигляд> Інспектор розміру> Вставка вмісту: Ніколи


1
Працював для мене :)
bhupinder

Чудово! Дякую :)
Саїд Ір

1
Це замість automaticallyAdjustsScrollViewInsetsв ios 11
Nik Kov

9

Я припускаю, що це лише частина нового 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];
    }
}

3
Якщо UITableViews (щоб бути більш конкретним UITableViewCellScrollView) в iOS7 навчив нас одне, це - залишити ієрархію перегляду вбудованих у класах поодинці.
Маттіас Баух

Гарна думка. Інший варіант -… продовжувати злому для кожної iOS;)
Dan Rosenstark

Ну, так. Мав намір написати це попередження, але забув.
Кевін

Кевін - Я думаю, ти маєш рацію, це задумом. Здається, повернення 0 для висотиForHeaderInSection - це найпростіший спосіб видалити цю підкладку. Чомусь у цьому конкретному екземплярі він не працював для мене, але він працює на інших UITableViews.
esilver

1
Це напевно "задумом". Якщо ви призупинили виконання та запустили: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]ви побачите, що заголовок таблиці, або перший заголовок розділу або перша комірка (залежно від того, що ви використовуєте), природно, залишає межу 35 пікселів .... boo.
Містер T

9

Моя відповідь стане більш загальною відповіддю, але може бути застосована і до цього.

Якщо перегляд кореня ( ViewController ) або перший дочірній підрозділ (підвід) кореневого перегляду є підкласом UIScrollView (або самого UIScrollView), і якщо

self.navigationController.navigationBar.translucent = YES;

Рамка автоматично встановить попередньо розрахований contentInset .


Щоб цього уникнути, ви можете зробити

self.automaticallyAdjustsScrollViewInsets = NO;

але в моєму випадку я не зміг цього зробити, тому що я реалізував SDK, який містить компонент UIView, який можуть використовувати інші розробники. Цей компонент UIView містить UIWebView (який має UIScrollView в якості першого підпідриву). Якщо цей компонент буде доданий в якості першої дочірки в ієрархії подання UIViewController, система застосовуватиме автоматичні вставки.

Я виправив це, додавши фіктивний вид з фреймом (0,0,0,0) перед додаванням UIWebView.

У цьому випадку система не знайшла підклас UIScrollView як перший підвідділ і не застосовувала вставки


рятівник! дякуюself.automaticallyAdjustsScrollViewInsets = false
ethanneff

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.

Я не зміг відтворити це в портретному xib, лише пейзажному xib. Пізніше я подам радіолокаційну помилку, якщо зможу відтворити її у простому демонстраційному додатку.


Зіткнувшись з тією ж проблемою, не вдалося її вирішити, змінивши contentInset, але цей метод спрацював, хоча він досить хакітний. Для чого це варто, використовуючи інструмент візуальної налагодження, я зміг побачити, що хоча UITableView мав правильну висоту, UITableViewWrapper всередині цього не робив.
Мік Фок

Ідеально. Це виправило помилку для мене в 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. Спасибі
Sylar

Перепробував усе на цій сторінці для iOS13, згрупованого перегляд таблиці з видом заголовка. self.tableView.tableHeaderView = UIView (кадр: CGRect (x: 0, y: 0, ширина: tableView.frame.size.width, висота: 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.


Це не відповідає на запитання. Питання полягало в тому, звідки береться зайвий інтервал, а не як його позбутися.
Стівен Ньюелл

дивно, що якщо ви повернете 0 у висотуForHeaderInsection, ви все одно отримаєте цей додатковий простір. Він прекрасно працює з CGFloat.leastNormalMagnitude (найменше позитивне число)
ShadeToD

7

Щоб бути конкретним, щоб видалити простір tableviewHeader зверху, я вніс ці зміни:

YouStoryboard.storyboard> YouViewController> Виберіть TableView> Інспектор розміру> Вставки вмісту - встановіть його ніколи.

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


Яка додаткова інформація, крім екрана екрана, порівняно з цією відповіддю ?
Artjom B.

я вважаю, що я не знайшов такої відповіді, коли шукав рішення. Чи слід тоді видалити свою відповідь ..?
user832

Не, якщо ви можете трохи розширити свою відповідь, описуючи, чому вставки вмісту = Ніколи насправді не вирішує цю проблему (як працює ця опція?).
Artjom B.

Коли вставки вмісту встановлено ніколи, tableView не буде прокручуватися вгору під час редагування textField.
mojtaba al moussawi

6

скористайтеся цим, я думаю, що ця допомога ...

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

1
Блискуче! Працює як шарм в 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
        }

автоматичноAdjustsScrollViewInsets = помилкова робота від мене! Дякую!
Даніель Кута
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.