Начиная с iOS7, в верхней части моей страницы есть дополнительное пространство, UITableView
которое имеет стиль UITableViewStyleGrouped
.
Вот пример:
Представление таблицы начинается с первой стрелки, необъяснимое заполнение составляет 35 пикселей, затем UIView
возвращается зеленый заголовок viewForHeaderInSection
(где сечение равно 0).
Может кто-нибудь объяснить, откуда берется это количество 35 пикселей и как я могу избавиться от него, не переключаясь на UITableViewStylePlain
?
Замечания:
В iOS 11 и более поздних версиях:
tableView.contentInsetAdjustmentBehavior = .never
ios
uitableview
ios7
esilver
источник
источник
UITableView
ему не нравится, когда ему присваивается заголовок с высотой 0,0. Проверьте stackoverflow.com/a/31223403/1394534 для получения дополнительной информации.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
примечание:0.0f
просто игнорируется, если вы используете его в высоте прямоугольника. Поэтому мы используем CGFloat, близкий к нулю (по крайней мере, это «сработало» для меня ... просто не идеальное решение).Ответы:
Мне помогло следующее:
YouStoryboard.storyboard> YouViewController> Инспектор атрибутов> Снять отметку - настроить вставки вида прокрутки.
источник
collectionview
. (Когда столик находится внутриcollectionviewcell
)Я поэкспериментировал с этим немного больше, и, похоже, это побочный эффект установки tableView
tableHeaderView = nil
.Поскольку у моего tableView есть динамически появляющееся
tableHeaderView
, когда мне нужно скрытьtableHeaderView
, вместо того, чтобы делатьself.tableView.tableHeaderView = nil;
, я делаю:Мне нравится это решение лучше, чем установка произвольного,
contentInset.top
потому что я использую иcontentInset.top
динамически. Необходимость помнить об удалении лишних 35 пикселей каждый раз, когда я пересчитываюcontentInset.top
, утомительна.источник
Debug > Color Misaligned Images
симулятор, чтобы убедиться в этом.) Вы не хотите этого делать.UITableViewHeaderFooterView
вместо UIView. ИCGFLOAT_MIN
работает так же, как и0.01f
лучше в теории.Для IOS 7, если вы выделяете табличное представление в контроллере представления, вы можете посмотреть в
ваша проблема казалась похожей на мою
Обновить:
Swift в iOS 9.x:
Свифт 3:
источник
UITableView
. Проблемы связаны с тем фактом, что myUITableView
находилсяUIViewController
внутри a, в результатеUINavigationController
чего содержание таблицы упало на 44 пункта, поэтому исходное содержимое не отставало отnavBar
. Это не было необходимо с моим макетом, так что это просто вызвало проблемы. В конце концов я изменил свой код,automaticallyAdjustsScrollViewInsets
который работал также.edgesForExtendedLayout = []
Попробуйте изменить
contentInset
свойство, котороеUITableView
наследуется отUIScrollView
.Это обходной путь, но он работает
источник
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);
работал лучше всего для меня, потому что было 20 дополнительных пикселей сверху и снизу.попробуйте, вы можете справиться с этим!
источник
uncheck Adjust scroll view insets
. Потому что иногда мы не используем раскадровку для создания нашего пользовательского интерфейса.Вы можете определить, работает ли ваше приложение на iOS7 или выше, и добавить эти два метода в ваш делегат табличного представления (обычно в коде UIViewController).
Возможно, это не элегантное решение, но у меня работает
Swift версия:
источник
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Я нашел причину моей первоначальной ошибки и создал демонстрационный проект, демонстрирующий ее. Я считаю, что есть ошибка iOS7.
Начиная с iOS7, если вы создаете UITableView со стилем «Сгруппированный», но не имеете делегата, установленного в первом макете, тогда вы устанавливаете делегат и вызываете reloadData, в верхней части будет пространство размером 35px, которое никогда не исчезнет.
Посмотрите этот проект, который я сделал, демонстрируя ошибку: https://github.com/esilverberg/TableViewDelayedDelegateBug
В частности, этот файл: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
Если линия 24 активна,
наверху будет дополнительное пространство 35 пикселей. Если строка 27 активна, а 24 закомментирована,
нет места сверху. Как будто tableView где-то кэширует результат, а не перерисовывает себя после того, как делегат установлен и вызывается reloadData.
источник
tableView:heightForHeaderInSection:
иtableView:heightForFooterInSection:
возвращает 0, у вас также будет эта проблема. Реализация описанных выше методов протокола и возвращение 0.01f исправили это для меня.Снимите флажок «Настроить вкладки прокрутки»
источник
Еще один быстрый комментарий ... даже в XCode 6.1 есть ошибка с вертикальными пробелами, появляющимися вверху
UIScrollViews
,UITextViews
иUITableViews
.Иногда единственный способ решить эту проблему - перейти в раскадровку и перетащить элемент управления проблемами, чтобы он больше не первым подпредставлением на странице.
(Моя благодарность Одеду за то, что он указал мне в этом направлении ... Я публикую этот комментарий, просто чтобы добавить несколько скриншотов, чтобы продемонстрировать симптомы и исправить.)
источник
Согласно этому руководству по переходу для iOS7 от Apple, вставки содержимого представления прокрутки автоматически настраиваются. Значение по умолчанию автоматически AdjustsScrollViewInsets набора параметров AdjustsScrollViewInsets установлено в YES.
UIViewController, который имеет UITableView, должен установить это свойство в NO.
Это сделает свое дело.
РЕДАКТИРОВАТЬ 1:
Также можно попробовать -
Это также удаляет лишнюю прокладку сверху.
источник
При использовании сгруппированного TableView используйте это, чтобы избежать срезания границ в viewWillAppear
источник
Многие предыдущие ответы слишком хакерские. Они могут сломаться в любое время в будущем, если Apple решит исправить это неожиданное поведение.
Корень проблемы:
a
UITableView
не любит иметь заголовок с высотой 0.0. Если то, что вы пытаетесь сделать, это иметь заголовок с высотой 0, вы можете перейти к решению.даже если позже вы назначите для заголовка не 0,0 высоту, a
UITableView
не любит, когда сначала присваивается заголовок с высотой 0,0.Решение:
Затем самое простое и надежное исправление - убедиться, что высота заголовка не равна 0, когда вы присваиваете его представлению таблицы.
Примерно так будет работать:
Нечто подобное может привести к проблеме в какой-то момент (обычно после прокрутки):
источник
tableView.tableHeaderView
на самом деле это дополнительное представление над содержимым строки. Меня все время путали с заголовками разделов, пока не вышел ваш ответ.CGFLOAT_MIN
был заменен наCGFloat.leastNormalMagnitude
в Swift 3Раскадровка:
Просто снимите флажок:
Adjust Scroll View Insets
в настройках View ControllerКод:
источник
Это решение для iOS 10 с использованием Swift 3:
Вы можете избавиться от верхнего и нижнего отступов, реализовав следующие методы из
UITableViewDelegate
.источник
В моем случае это было то, что мне помогло. Я также поддерживаю ios6.
источник
Просто добавьте следующее в viewDidLoad в вашем VC:
источник
Так что я пробовал все методы здесь, и на этот раз ни один из них не помог. Мой случай был сгруппированным табличным представлением на iOS 9. Я действительно не знаю, почему и как я узнал это, но для меня сработала настройка
tableViewHeader
сUIView
по крайней мере0.01
высотой.CGRectZero
не помогло, ничего не помоглоисточник
Swift: iOS У меня был вид таблицы в виде прокрутки ... когда я нажимал "Назад" на том же экране. Вид прокрутки занимает больше места сверху ... для решения этой проблемы я использовал:
Логическое значение, которое указывает, должен ли контроллер представления автоматически корректировать свои вставки представления прокрутки. Значение по умолчанию - true, что позволяет контроллеру представления корректировать его вставки представления прокрутки в ответ на области экрана, занятые строкой состояния, панелью навигации, а также панелью инструментов или панелью вкладок. Установите значение false, если вы хотите самостоятельно управлять настройками вставки вида прокрутки, например, когда в иерархии представлений имеется более одного прокрутки.
источник
Благодаря ответу @Aurelien Porte. Вот мое решение
Причина этой проблемы: -
В ViewDidLoad: -
Не нужно что-то вроде этого: -
В
heightForHeaderInSection
делегате: -В
viewForHeaderInSection
делегате: -источник
Вот как это можно легко исправить в iOS 11 и Xcode 9.1 через раскадровку:
Выберите «Вид таблицы»> «Инспектор размеров»> «Вставки содержимого»: никогда
источник
automaticallyAdjustsScrollViewInsets
ios 11Я предполагаю, что это только часть нового
UITableViewStyleGrouped
стиля. Это во всех сгруппированных табличных представлениях, и, кажется, нет никакого прямого способа управлять этим пространством.Если это пространство представлено символом a
UIView
, можно будет выполнить поиск по всемsubviews
из них,UITableView
чтобы найти это конкретное представление и отредактировать его напрямую. Тем не менее, существует также вероятность того, что это пространство является жестко заданным смещением до начала заголовков и ячеек, и редактировать его будет невозможно.Для поиска по всем подпредставлениям (я бы запустил этот код, когда в таблице нет ячеек, чтобы было легче читать вывод):
источник
UITableViewCellScrollView
) на iOS7 научили нас одной вещи, это оставить иерархию представлений только для встроенных классов.po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]
вы увидите, что заголовок таблицы, или заголовок первого раздела, или первая ячейка (в зависимости от того, что вы используете) естественно оставляют границу 35px .... boo.Мой ответ будет более общим, но может быть применен и к этому.
Если корневое представление ( ViewController ) или первый дочерний элемент ( подпредставление ) корневого представления является подклассом UIScrollView (или самого UIScrollView), и если
Фреймворк автоматически установит предварительно рассчитанный контентInset .
Чтобы избежать этого вы можете сделать
но в моем случае я не смог этого сделать, потому что я реализовывал SDK, который имеет компонент UIView, который может использоваться другими разработчиками. Этот компонент UIView содержит UIWebView (который имеет UIScrollView в качестве первого подпредставления). Если этот компонент добавлен как первый дочерний элемент в иерархии представления UIViewController, автоматические вставки будут применены системой.
Я исправил это, добавив фиктивный вид с рамкой (0,0,0,0) перед добавлением UIWebView.
В этом случае система не нашла подкласс UIScrollView в качестве первого подпредставления и не применила вставки
источник
self.automaticallyAdjustsScrollViewInsets = false
Этот код работал для меня, лучший ответ для меня, который был написан в
objective-C
верхней части, поэтому я преобразовал его в Swift.Просто запишите это,
viewDidLoad()
и это будет работать как шарм.источник
У меня было такое же исправление, как у ариелиза. Как только я переместил UITableView, чтобы он не был первым подпредставлением родительского представления, он исчез. Мое пространство было 20 пикселей, а не 35.
Я не смог воссоздать его в портретной графике, только в альбомной графике. Я опубликую ошибку радара позже, если смогу воспроизвести ее в простом демонстрационном приложении.
источник
Я думаю, что создание UIEdgeInsets -35 0 0 0 утомительно. В моем случае я реализовал tableView: heightForHeaderInSection: метод, и он может возвращать 0.
Когда я изменил 0 на 0.1f, проблема просто исчезла.
источник
Единственное, что сработало для меня, было:
Свифт :
Цель-C :
Кроме того, у меня все еще было дополнительное место для первого раздела. Это потому, что я
tableHeaderView
неправильно использовал собственность. Исправлено это также добавлением:источник
Код Swift 4: для таблицы без заголовков разделов вы можете добавить этот код:
и вы получите интервал заголовка до 0.
Если вы хотите заголовок вашей конкретной высоты, передайте это значение:
и представление от viewForHeaderinSection делегата.
источник
Чтобы быть определенным, чтобы удалить пространство tableviewHeader сверху, я сделал эти изменения:
YouStoryboard.storyboard> YouViewController> Выберите «TableView»> «Инспектор размеров»> «Вставки содержимого» - установите для него значение «никогда».
источник
используйте это, я думаю, это поможет ...
источник
источник