UITableView починається зі зміщення в iOS 7


115

Я перетягнув звичайний джейн UITableView на UIViewController в iOS 7.

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

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

Будь-які ідеї?


43
Мені допомогли наступні: YouStoryboard.storyboard> YouViewController> Інспектор атрибутів> Зніміть прапорець - Налаштувати вставки прокрутки для перегляду.
Олександр

17
btw, ви можете зробити знімок екрана iOS Simulator за допомогою клавіші Command + S
Hemang

@Alexander: Мені також допомогли ваші пропозиції, проте знявши прапорець ExtendEdges.UnderTopBars знову з’явився простір вертикального зміщення. Я не впевнений, чи є її одна з (багатьох?) Помилок у Xcode6, але ці питання раз у раз викликають у мене досить головні болі!
iOS-Coder

Відповіді:


81

За замовчуванням контролери подання таблиці засунуть вміст під панель навігації, щоб ви могли прокручувати вміст під ним і бачити його в розмитому стані під панелі навігації / панелі інструментів.

Схоже, ви розміщуєте його на 44 (можливо 64) px, щоб перемістити його з-під панелі навігації, але це вже компенсує це, так що ви отримаєте великий розрив.

Перейдіть до розкадрівки / xib в IB та зніміть позначку вмісту шоу під матеріалами наві-бар.


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

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

Щоб відключити цю поведінку, зніміть прапорці для всіх потрібних UIViewControllers в InterfaceBuilder, у вибраному інспекторі об'єктів UIViewController :

Переглянути інспектор контролера

Детальніше:

  1. Надішліть свої додатки iOS 7 вже сьогодні.
  2. Посібник з переходу інтерфейсу iOS 7> Зовнішній вигляд та поведінка

Дякую! Ти врятував мене.
rsc

68

З посібника з переходу iOS7:

Якщо ви не хочете, щоб вставки вмісту перегляду прокрутки автоматично регулювалися, встановіть автоматичне налаштуванняScrollViewInsets на НІ. (Значення за замовчуванням автоматичноAdjustsScrollViewInsets - ТАК.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Це також можна встановити в XCode на інспекторі атрибутів. Зніміть Adjust Scroll View Insetsпрапорці для макета контролера перегляду.
Андрій

1
Якщо ви завантажуєте програму UIViewController програмно (не використовуючи XIB), це працює як шарм. Встановити automaticallyAdjustsScrollViewInsets = NOв контролері подання.
KabraBoja

Це було для мене. Плутанина, оскільки мій TableView знаходився всередині перегляду контейнера і спочатку здавався чудовим. Але він закрутився при відскоку назад від іншого контролера перегляду.
n13

Чудово! Збережіть мені багато часу!
inix

34

У мене була подібна проблема, після відхилення viewController змістOffset з мого tableView було змінено на (0, -64).

моє рішення було трохи дивним, я спробував усі інші відповіді, але не мав успіху, єдине, що вирішило мою проблему, - це переключити позицію tableView у керуванні дерева .xib

це було перше управління у батьківському перегляді так:

раніше

Я перемістив tableView відразу після ImageView, і він працював:

після

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

PD Я не використовую autoLayout, ані розклади

сподіваюся, що це може комусь допомогти!


Я помітив те саме! Я не ставлю додаткових поглядів, але просто компенсую проміжок, переміщуючи верхню частину UITableView -44. У ІБ здається, що я повинен перемістити -64px, але під час виконання -64px викликати накладку tablview накладення навігаційної панелі і -44px гаразд. Я не можу зовсім пояснити це. Я знайшов цю проблему в режимі перегляду iPad, коли я не помітив жодної подібної проблеми в розгортці iPhone.
Майк Кескінов

Ця проблема виникає навіть при uiview. якщо представлення, показане в інтерфейсі користувача, розміщене не в тому ж порядку.
Рінку

2
У мене була та сама проблема сьогодні, з XCode 6.1. Крейдайте ще 2-3 години марно, намагаючись обійти помилки Apple ...
Майк Гледхілл

3
Це було надзвичайно корисно і заслуговує на більшу увагу! Не допомогло жодна кількість налаштувань із налаштуваннями контролера перегляду чи введенням / зміщенням вмісту, але зміна порядку переглядів у дошці розкадрування вирішила проблему для мене.
Калеб

1
Apple, я маю на увазі ... WTF? Спасибі людині, це також виправлено розкадровку з автоматичним розкладом.
Борж

30

це вирішує мою подібну проблему:

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

1
Ви повинні перевірити системну версію таким чином:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

Це спрацювало для мене з проблемою проміжку, яку я мав, але тепер мій перемикач управління, який перебуває для оновлення, відображається частково затьмареним і під моїм головним меню. Хтось теж бачив це? Будь-які обходи?
Нік

@ nickv2002 спробуйте створити tableView програмно
Олексій

Я спробував усі інші рішення, але тільки для мене це працювало
DanielR

13

Спробуйте скористатися цим

tableView.separatorInset = UIEdgeInsetsZero;

Очевидно, що якщо ви підтримуєте що-небудь менше, ніж iOS7, вам потрібно буде переконатися, що об’єкт відповідає на цей селектор, перш ніж викликати його.


4
не впевнений, чому це проголосується ... separatorInset просто змінює відстані між клітинками, вставленими від краю виду. Питання задається про простір над і під клітинками
Рембрандт Q. Ейнштейн

Зображення вводить в оману, але загальна пошукова проблема Google для проблеми із полями дає цю сторінку.
Буде

9

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

Сподіваємось, це економить когось кілька хвилин. З.


1
я пропустив його повністю, радий, що знайшов вашу відповідь, ПОВІДОМЛЕННЯ
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 .... насправді, нічого іншого не допомогло, і я все це випробував, де ти це знайшов, або як ти це зрозумів? багато 10х
Ерез

Зняти Adjust Scroll View insetsпрапорець прапорець для iOS 9.
Адам

Налаштування прокрутки Переглянути вставки, які не працюють для мене на будь-яке інше рішення?
Йогеш Пател

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;
}

2

Якщо ви додасте порожній UIView перед UITableView (або будь-який перегляд можна прокручувати, наприклад, ScrollView і TextView), ви можете пощастити.


1

У мене був вигляд UITableViewController, вбудований у вигляд контейнера. Щоб позбутися від небажаних 64 точок вертикального простору, мені потрібно було зняти прапорець "Налаштувати вкладиші прокрутки прокрутки" в програмі Interface Builder та встановити вміст InITableView contentInset у поданні мого UITableViewControllerWillAppear як нижче.

Здається, що розмір вертикального простору відповідає висоті кадру навігаційної панелі та зсуву. Проблема виникла лише на 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

У 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 з нульовою висотою пікселів. Працює з Autolayout або без нього.
  2. Якщо я відчуваю себе впевнено :-) Я знімаю цей підроблений вид, виправляю обмеження на вершині, і магічно це спрацьовує.

Не запитуйте мене чому, я все ще думаю, що це помилка в UIKit.


0

Якщо ви переходите до раскадровки, ви можете змінити зміщення, вибравши таблицю, а в розділі «Перегляд таблиці» в інспекторі атрибутів ви просто зміните вставки сепаратора зліва на 0.


0

Я думаю, що справжнє рішення полягає в тому, щоб встановити обмеження на верхній і нижній частині перегляду таблиці рівними 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
    }
}

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


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)];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.