UITableView начинается со смещения в iOS 7
Я перетащил простой jane UITableView на UIViewController в iOS 7.
Теперь перед первым ядром начинается вертикальное смещение пространства. Как я могу избавиться от него? Я хочу, чтобы первая строка была намного ближе к верхнему краю, где начинается UITableView. Я не просил о большом смещении, если бы я?
![enter image description here]()
Любые идеи?
Ответы
Ответ 1
По умолчанию контроллеры табличных представлений помещают содержимое вниз под панель навигации, чтобы вы могли прокручивать содержимое под ним и видеть его в размытом состоянии под панелью навигации/панелью инструментов.
Похоже, вы позиционируете его на 44 (возможно, 64) px, чтобы вывести его из-под навигационной панели, но он уже компенсирует это, поэтому вы получаете большой пробел.
Перейдите в раскадровку /xib в IB и отключите контент шоу в разделе навигационных баров.
Ответ 2
В новой реализации iOS 7 UIViewController появился новый набор параметров, который позволяет разработчику выбирать, будет ли система автоматически добавлять вставки для UIScrollView strong > , UITableView и выводами.
Чтобы отключить это поведение, снимите этот флажок для всех требуемых UIViewControllers в InterfaceBuilder, в UIViewController выбранный инспектор объектов:
![View Controller Inspector]()
Подробнее:
Ответ 3
Из руководства по переходу iOS7:
Если вы не хотите, чтобы прокрутки отображали вставки содержимого автоматически отрегулировано, автоматически устанавливаетсяAdjustsScrollViewInsets на NO. (По умолчанию Значение autoAdjustsScrollViewInsets равно YES.)
self.automaticallyAdjustsScrollViewInsets = NO;
Ответ 4
У меня была аналогичная проблема, после отклонения viewController, contentOffset из моего tableView был изменен на (0, -64).
мое решение было немного странным, я пробовал все остальные ответы, но не имел успеха, единственное, что исправляло мою проблему, заключалось в том, чтобы переключить позицию tableView в дереве элементов управления .xib
это был первый элемент управления в родительском представлении:
![before]()
Я переместил tableView сразу после ImageView и работал:
![after]()
кажется, что помещать представление таблицы в первую позицию вызывало проблемы, и перемещение представления таблицы в другую позицию устраняло проблему.
P.D. Я не использую autoLayout ни раскадровки
надеюсь, что это может помочь кому-то!
Ответ 5
он разрешает мою аналогичную проблему:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Ответ 6
Попробуйте использовать
tableView.separatorInset = UIEdgeInsetsZero;
Очевидно, что если вы поддерживаете что-то меньшее, чем iOS7, вам нужно будет убедиться, что объект отвечает на этот селектор перед его вызовом.
Ответ 7
С iOS 9 ни один из других ответов с этой страницы не работал у меня (т.е. снятие флажков в Storyboard, установка automaticallyAdjustsScrollViewInsets
на NO
).
Мое обходное решение Я действительно недоволен тем, что:
- (void)viewDidAppear:(BOOL)animated {
self.tableView.contentOffset = CGPointMake(0.0, 0.0);
self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}
Те же строки в viewWillAppear
или viewDidLoad
оказались неэффективными.
Ответ 8
Серьезно, изменение contentOffset
не является решением. Вы просто исправляете проблему и не устанавливаете причину. Я столкнулся с той же проблемой, и оказалось, что сгруппированные tableViews имеют прописку сверху. В моем случае установка типа в plain сделала трюк.
Надеюсь, это спасет кого-то несколько минут.
Z.
Ответ 9
Иногда я получаю пробел высоты 64
в верхней части моего представления таблицы, когда UIViewController
встроен в контроллер навигации.
![введите описание изображения здесь]()
В прошлом я бы просто воссоздал все, надеясь, что ограничения будут исправлены после чистого слайда.
TIL: Если вы не хотите устанавливать вертикальное ограничение на Top Layout Guide
, вы можете удерживать клавишу Option
для доступа к Container Margin
.
![введите описание изображения здесь]()
Затем убедитесь, что константа Top Space to Superview
установлена на 0
. Это работало для меня как минимум.
![введите описание изображения здесь]()
Ответ 10
Это работает для меня:
- (void)loadView
{
[super loadView];
[self setAutomaticallyAdjustsScrollViewInsets:YES];
self.edgesForExtendedLayout = UIRectEdgeNone;
self.view.frame = CGRectZero;
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
Ответ 11
Если вы добавите пустой UIView перед UITableView (или любое прокручиваемое изображение, например ScrollView и TextView), вам может повезти.
Ответ 12
У меня был UITableViewController, встроенный в представление контейнера. Чтобы избавиться от нежелательных 64 точек вертикального пространства, мне нужно было снять флажок "Настроить прокрутки" в "Конструкторе интерфейсов" и установить UITableView contentInset в моем представлении UITableViewControllerWillAppear, как показано ниже.
Размер вертикального пространства, по-видимому, соответствует высоте рамки навигационной панели и смещению y. Проблема возникла только в iOS 7.
- (void)viewWillAppear:(BOOL)animated;
{
[super viewWillAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
const CGRect navBarFrame = self.navigationController.navigationBar.frame;
const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
}
}
Ответ 13
В Xamarin iOS у меня возникла проблема, возникшая на фоне UITableViewController сразу после отклонения модального диалога переднего плана. В процессе перехода на передний план в UITableViewController были установлены вставки (где-то iOS):
Этот класс решил его
public class UITableViewControllerWithBugFix : UITableViewController {
public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
}
public override void ViewWillLayoutSubviews() {
if (TableView.ContentInset.Top != 0.0f)
TableView.ContentInset = UIEdgeInsets.Zero;
if (TableView.ScrollIndicatorInsets.Top != 0.0f)
TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;
base.ViewWillLayoutSubviews();
}
}
Ответ 14
Время от времени я возвращаюсь в эту ужасную ситуацию, и я замечаю, что она еще совсем неизвестна. Итак, для будущей памяти...
В последнее время я исправляю это обходное решение.
- Добавьте подвью в верхней части UITableView с нулевой высотой пикселя. Работает с Autolayout или без.
- Если я чувствую себя уверенно:-) Я удаляю этот фальшивый взгляд, исправляю ограничения сверху, и волшебным образом это работает.
Не спрашивайте меня, почему, я все еще думаю, что это ошибка в UIKit.
Ответ 15
Если вы перейдете к раскадровке, вы можете изменить смещение, выбрав таблицу, а в разделе "Просмотр таблицы" в инспекторе "Атрибуты" вы просто измените вставки разделителя слева на "0".
Ответ 16
Я думаю, что реальное решение состоит в том, чтобы настроить верхние и нижние ограничения на представление таблицы равным topMargin и bottomMargin. Не руководство по началу макета и руководство по планированию нижней части. Это позволяет сохранить автоматическиAdjustsScrollViewInsets, чтобы быть правдой.
Ответ 17
Решение Swift 3:
class PaddingLessTableView : UITableView
{
override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
}
Ответ 18
Если вы встроили свой TableViewController в NavigationController или ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard
. Check constraint to margins when you are doing the constraints
Никакой другой способ не работал у меня. Я не мог комментировать, поэтому я просто повторяю ответ Роберта Чен.
Ответ 19
Я попробовал несколько ответов. Изменение настроек в раскадровке вызвало проблемы пульсаций с помощью меню наложения, которое появляется слева.
У меня только пустой UIViewController в раскадровке, иначе все будет программно сгенерировано.
У меня такая же проблема с UITableView внутри UIView внутри UIViewController. А именно, заголовки разделов начинают слишком далеко вниз, когда UIViewController встроен в контроллер навигации. Без контроллера навигации все работает нормально.
Чтобы устранить проблему, я создал UILabel и с ограничениями установил нижнее ограничение UILabel = верхнее ограничение UIView (поэтому оно не отображается на экране. Теперь с этим дополнительным элементом управления (новая метка) TableView ведет себя правильно.
inputsContainerView.addSubview(titleLabel)
inputsContainerView.addSubview(tableView)
// inputsContainerView
///////////////////////////////////////
inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true
// tableView
///////////////////////////////////////
tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true
// titleLabel - inserted to stop bad section header behavior
///////////////////////////////////////
titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true