Почему в верхней части моего 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]()