it-swarm.com.ru

UITableView начинается со смещения в iOS 7

Я перетащил простой JIT UITableView на UIViewController в iOS 7.

Теперь есть вертикальное смещение пространства до начала первой ячейки. Как мне от этого избавиться? Я хочу, чтобы первая строка была намного ближе к верхнему краю, где фактически начинается UITableView. Я не спрашивал о большом смещении, не так ли?

enter image description here

Есть идеи?

113
user798719

По умолчанию контроллеры табличного представления размещают содержимое под панелью навигации, чтобы вы могли прокручивать контент под ним и видеть его в размытом состоянии под панелью навигации/панели инструментов.

Похоже, вы устанавливаете его на 44 (возможно, 64) пикселя, чтобы вывести его из-под навигационной панели, но это уже компенсирует это, так что вы получаете большой разрыв.

Перейдите на раскадровку/xib в IB и снимите галочку с содержания шоу под панелью навигации.

81
Cocoadelica

Новая iOS 7 реализация UIViewController имеет новый набор параметров, которые позволяет разработчику выбирать, будет ли система автоматически добавлять вставки для UIScrollView , UITableView и деривации.

Чтобы отключить это поведение, снимите эти флажки для всех ваших требуемых UIViewController в InterfaceBuilder, на UIViewController выбранный инспектор объектов:

View Controller Inspector

Больше подробностей:

  1. Отправьте свои приложения для iOS 7 сегодня.
  2. Руководство по переходу с iOS 7 на интерфейс> Внешний вид и поведение
106
xudre

из руководства по переходу с iOS7:

Если вы не хотите, чтобы вставки содержимого представления прокрутки автоматически настраивались, автоматически установите для параметра AdjustsScrollViewInsets значение NO. (Значение по умолчанию для автоматического набора параметров AdJustsScrollViewInsets - ДА.)

   self.automaticallyAdjustsScrollViewInsets = NO;
68
sovanlandy

у меня была похожая проблема, после отклонения viewController, contentOffset из моего tableView был изменен на (0, -64).

мое решение было немного странным, я попробовал все остальные ответы, но безуспешно, единственное, что решило мою проблему, это переключить позицию tableView в дереве элементов управления .xib

это был первый элемент управления в родительском представлении:

before

Я переместил tableView сразу после ImageView, и это сработало:

after

кажется, что перевод представления таблицы в первое положение вызывал проблему, а перемещение представления таблицы в другое положение решало проблему.

Полицейское управление Я не использую autoLayout ни раскадровки

надеюсь, это поможет кому-то!

34
Chuy47

это решает мою похожую проблему:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
30
Alex

Попробуйте использовать это

tableView.separatorInset = UIEdgeInsetsZero;

Очевидно, что если вы поддерживаете что-то меньшее, чем iOS7, вам нужно убедиться, что объект отвечает на этот селектор, прежде чем вызывать его.

13
David Attaie

Серьезно, изменение contentOffset не является решением. Вы просто исправляете проблему, а не исправляете причину. Я столкнулся с той же проблемой, и оказалось, что сгруппированные tableViews имеют отступ сверху. В моем случае установка типа plain сделала свое дело.

Надеюсь, это сэкономит кому-то несколько минут. З.

9
Zoltán

В iOS 9 ни один из других ответов на этой странице не работал для меня (то есть снятие флажков в раскадровке, установка 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
Dirty Henry

Иногда я получаю пробел высоты 64 в верхней части моего табличного представления, когда UIViewController встроен в контроллер навигации.

enter image description here

В прошлом я просто воссоздавал все, надеясь, что ограничения окажутся правильными после чистого листа.

СОВЕТ: Если вы не хотите накладывать вертикальное ограничение на Top Layout Guide, вы можете удерживать клавишу Option, чтобы получить доступ к Container Margin.

enter image description here

Затем убедитесь, что константа Top Space to Superview установлена ​​в 0. Это сработало для меня по крайней мере.

enter image description here

5
Robert Chen

Это работает для меня:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
4
yeahdixon

Если вы добавляете пустой UIView перед UITableView (или любой вид с возможностью прокрутки, такой как ScrollView и TextView), вам может повезти.

2
Soft Dev

В 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();
    }
}
1
Herman Schoenfeld

Время от времени я возвращаюсь к этой ужасной ситуации и замечаю, что она до сих пор совершенно неизвестна. Итак, для будущей памяти ...

В последнее время я исправляю это.

  1. Добавьте подпредставление в верхней части UITableView с нулевой высотой пикселей. Работает с Autolayout или без.
  2. Если я чувствую себя уверенно :-) Я удаляю это поддельное представление, устанавливаю ограничения сверху, и волшебным образом это работает.

Не спрашивайте меня почему, я все еще думаю, что это ошибка в UIKit.

1
klauslanza

У меня был UITableViewController, встроенный в представление контейнера. Чтобы избавиться от ненужных 64 точек вертикального пространства, мне нужно было снять флажок "Настроить вставки вида прокрутки" в Интерфейсном Разработчике и установить contentInset UITableView в viewWillAppear моего UITableViewController, как показано ниже.

Размер вертикального пространства соответствует высоте рамки навигационной панели и смещению 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);
    }
}
1
user2067021

У меня была такая же проблема в iOS 11 и Xib, UITableviewController, и я решил ее, как показано ниже

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
0
dobiho

Решение Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
0
hhamm

Я попробовал несколько ответов. Изменение настроек в раскадровке вызвало проблемы с пульсацией в меню наложения, которое появляется слева.

У меня есть только пустой 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
0
john

Если вы перейдете к раскадровке, вы можете изменить смещение, выбрав таблицу, и в разделе "Вид таблицы" в инспекторе атрибутов просто измените вкладки "Разделитель" слева на 0.

0
Nyctitropist

Я думаю, что реальное решение состоит в том, чтобы установить ваши верхние и нижние ограничения на табличное представление равными topMargin и bottomMargin. Не верхнее руководство по макету, а нижнее руководство по макету. Это позволяет вам автоматически сохранять AdjustsScrollViewInsets в true.

0
Dan

Если вы встроили свой 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 Никакой другой способ не работал для меня. Я не мог комментировать, поэтому я просто повторяю ответ Роберта Ченса.

0
user3296487