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

115

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

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

введите описание изображения здесь

Любые идеи?

user798719
источник
43
Мне помогло следующее: YouStoryboard.storyboard> YouViewController> Инспектор атрибутов> Снять отметку - Настроить вставки прокрутки.
Александр
17
кстати, вы можете сделать снимок экрана iOS Simulator, используя клавишу Command + S
Hemang
@Alexander: Мне также помогли ваши предложения, однако снятие флажка ExtendEdges.UnderTopBars снова привело к появлению пространства вертикального смещения. Я не уверен, что это одна из (многих?) Ошибок в Xcode6, но эти проблемы время от времени доставляют мне немало головной боли!
iOS-Coder

Ответы:

81

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

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

Перейдите в раскадровку / xib в IB и снимите отметку с показа содержимого в разделе «Материал панели навигации».

Cocoadelica
источник
6
Извините, почему комментарий о NDA на iOS7 неуместен? Это форум в помощь людям.
Cocoadelica,
В Xcode версии 5.1 на Viewcontroller снимите отметку с расширенных краев> Под верхними полосами, чтобы удалить верхнюю вставку содержимого UITableView
Эмель Элиас,
3
Итак, где же контент шоу под панелью навигации thigo? Я не могу его найти.
Ануп Каттель
10
@FrankGorman в Xcode 5.1.1 есть опция в раскадровке для конкретного контроллера представления Adjust Scroll View insets, удалите галочку.
Корат прашант
1
эй @koratprashant. очень полезный комментарий.
KDeogharkar
107

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

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

Просмотр инспектора контроллера

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

  1. Отправьте свои приложения для iOS 7 сегодня.
  2. Руководство по переходу на пользовательский интерфейс iOS 7> Внешний вид и поведение
xudre
источник
Спасибо! Ты спас меня.
rsc
68

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

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

   self.automaticallyAdjustsScrollViewInsets = NO;
sovanlandy
источник
9
Это также можно установить в XCode в инспекторе атрибутов. Снимите Adjust Scroll View Insetsфлажок для макета контроллера представления.
Эндрю
1
Если вы загружаете UIViewController программно (без использования XIB), он работает как шарм. Устанавливается automaticallyAdjustsScrollViewInsets = NOв контроллере представления.
KabraBoja
Это было для меня. Непонятно, потому что мой TableView находился внутри контейнера и изначально выглядел нормально. Но он облажался при возврате из другого контроллера представления.
n13 01
Большой! Сэкономьте мне много времени!
inix
34

У меня была аналогичная проблема, после увольнения viewController contentOffset из моего tableView был изменен на (0, -64).

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

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

перед

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

после

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

П.Д. Я не использую ни autoLayout, ни раскадровки

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

Chuy47
источник
Я заметил то же самое! Я не добавляю никаких дополнительных представлений, но просто компенсирую пробел, перемещая верхнюю часть UITableView -44. В IB кажется, что мне нужно переместить -64px, но во время выполнения -64px вызывает наложение tablview на панель навигации, и -44px в порядке. Я не могу это объяснить. Я обнаружил эту проблему в всплывающем окне iPad, когда не заметил подобной проблемы в раскадровке iPhone.
Майк Кескинов
Эта проблема возникает даже с uiview. если представления, отображаемые в пользовательском интерфейсе, расположены не в том же порядке.
Ринку
2
Сегодня у меня была такая же проблема с XCode 6.1. Запишите еще 2-3 часа, потраченные впустую, пытаясь обойти ошибки Apple ...
Майк Гледхилл,
3
Это было очень полезно и заслуживает большего внимания! Никакие возни с настройками контроллера представления или вставкой / смещением содержимого не помогли, но изменение порядка представлений в раскадровке решило проблему для меня.
Калеб
1
Я имею в виду Apple ... WTF? Спасибо, чувак, это также исправлена ​​раскадровка с автопластинкой.
Borzh
30

это решает мою аналогичную проблему:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Alex
источник
1
Вы должны проверить версию системы следующим образом:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes
Это сработало для меня из-за проблемы с интервалом, которая у меня была, но теперь мой счетчик управления оттягиванием для обновления отображается частично скрытым и под моим верхним меню. Кто-нибудь это тоже видел? Есть обходные пути?
Ник
@ nickv2002 попробуйте создать tableView программно
Alex
Я пробовал все другие решения, но только это сработало для меня
DanielR
13

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

tableView.separatorInset = UIEdgeInsetsZero;

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

Дэвид Аттей
источник
4
не уверен, почему это голосуется ... separatorInset просто изменяет расстояние между ячейками, вставляемыми от края представления. Вопрос касается пространства над и под ячейками
Рембрандт К. Эйнштейн
Изображение вводит в заблуждение, но обычный поиск в Google по проблеме маржи дает эту страницу.
Will
9

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

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

Золтан
источник
1
Я пропустил это полностью, рад, что нашел ваш ответ, UPVOTE
AamirR
8

С 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оказались неэффективными.

Грязный Генри
источник
Это должен быть единственный ответ для uitableviewcontroller iOS 9 .... на самом деле, больше ничего не помогло, и я перепробовал их все, где вы это нашли или как вы это поняли? many 10x
Erez
Снятие Adjust Scroll View insetsфлажка работает для iOS 9.
Адам
Настроить вставки Scroll View не работают для меня какое-либо другое решение?
Йогеш Патель
5

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

введите описание изображения здесь

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

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

введите описание изображения здесь

Затем убедитесь, что для Top Space to Superviewконстанты установлено значение 0. По крайней мере, это сработало для меня.

введите описание изображения здесь

Роберт Чен
источник
1,5 года спустя, но это решило мой вечер. Спасибо!
asp_net
4

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

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
yeahdixon
источник
2

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

колесико
источник
1

У меня был UITableViewController, встроенный в представление контейнера. Чтобы избавиться от нежелательных 64 точек вертикального пространства, мне нужно было снять галочку с «Adjust Scroll View Insets» в Interface Builder и установить 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);
    }
}
user2067021
источник
1

В 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

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

В последнее время я исправляю этот обходной путь.

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

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

klauslanza
источник
0

Если вы перейдете в раскадровку, вы можете изменить смещение, выбрав таблицу и в разделе «Просмотр таблицы» в Инспекторе атрибутов вы просто измените значение «Вставки разделителя» слева на 0.

Nyctitropist
источник
0

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

Дэн
источник
0

Решение Swift 3:

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

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
hhamm
источник
0

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

user3296487
источник
0

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

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

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

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
dobiho
источник