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