Видаліть порожнє місце перед клітинками в UITableView


172

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

Якщо я поміщую верхній лівий кут того місця, UITableViewде я хочу, щоб вони знаходились, він не розміщуватиме клітини там:

Тепер, якщо я просто переміщу подання таблиці вгору, щоб комірки знаходилися в потрібному місці, у мене виникає інша проблема - комірки можна перемістити туди під час прокрутки (це пальцем вище контролера навігації):

Коли я відпущу, так - комірки підуть прямо під панель пошуку, але це, очевидно, проблема, як ви можете їх вивести над ним.

Як би я пішов робити це? Чи є простіший спосіб?

Відповіді:


378

Чи клітини UITableViewпоказують на порожньому просторі, коли ви прокручуєте вниз?

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

Ще слід зазначити, що iOS коригує вставку вмісту лише для першого перегляду в ієрархії перегляду, якщо він є UIScrollViewабо він є нащадком (наприклад, UITableViewта UICollectionView). Якщо ваша ієрархія перегляду включає в себе декілька подань прокрутки, automaticallyAdjustsScrollViewInsetsвнесете корективи лише у перший.

Ось як змінити таку поведінку:

a) Інтерфейс Builder

  • Виберіть контролер перегляду
  • Інспектор відкритих атрибутів
  • В інспекторі атрибутів IB (якщо вибрано контролер перегляду) є властивість під назвою "Налаштувати вкладиші прокрутки", яка за замовчуванням увімкнена. Зніміть цей прапорець:


    (Зображення надано Dheeraj D )

Я не впевнений, яка версія Xcode представила цю опцію (не помітила її у примітках до випуску), але вона принаймні доступна у версії 5.1.1.

Редагувати: Щоб уникнути плутанини, це був третій варіант, згаданий у коментарях

б) програмно

Додайте це тобто viewDidLoad(кредити до відповіді Славко Петковського та коментар Криса Р )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

в) Це може бути актуально для старих школярів

Ви можете це виправити, додавши

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Або якщо ви використовуєте ІБ та якщо панель навігації не прозора (не можу сказати зі знімка екрана)

  • Виберіть контролер перегляду
  • Інспектор відкритих атрибутів
  • У розділі "Параметри перегляду контролера" Розділ "Розширити краї" зніміть позначку "Під верхніми смугами"

2
Скасування вибору "Under Top Bars" на UIView мені спрацювало чудово. Дякую.
Andreas Øverland

Я зійшов з розуму, використовуючи "Paging Enabled", і прокрутка зміщується лише на висоту панелі навігації замість усієї комірки. Дякую.
LordParsley

8
Третій варіант: зніміть прапорець "Налаштувати прокрутки для перегляду прокрутки" - спрацювало як шарм. дякую лекксі!
Стас Жуковський

2
self.automaticallyAdjustsScrollViewInsets = false у Swift працює "de pelos"!
Cris R

1
Завдяки налаштуванню UIEdgeInsetsZero потрібно, якщо повторно використовувати таблицю в новому контролері таблиці кожного разу, коли її відображається в іншому випадку, з’являється однаковий білий проміжок і стає все більшим і більшим.
злочин

71

У мене була ця сама проблема, і я майже впевнений, що в один момент там був UIView. Просто скопіюйте подання цілого столу, видаливши його та вставте його знову зафіксувавши.


7
це насправді дуже дивно. Це вирішило питання. Будь-яка ідея, коли це станеться?
MiQUEL

Я думаю, ви можете вирішити це набагато простіше, дотримуючись моєї відповіді від 10 жовтня
netshark1000

Мав те саме питання. Видалення та читання також працювало для мене.
sma

3
Наскільки я знаю, вставки вмісту перегляду прокрутки налаштовуються автоматично (якщо автоматичноAdjustsScrollViewInsets = ТАК, так це за замовчуванням), лише якщо подання прокрутки є першою дочірньою в ієрархії подання контролера подання. Я здогадуюсь, що це рішення працює, оскільки після вставки копії подання таблиці це вже не перший погляд в ієрархії перегляду.
lekksi

Що трапляється, що коли tableView - це перше, що ви додаєте до перегляду, система вважає, що він повинен залишити місце для навігації. Я думаю, що деякі люди додають tableView, а потім headerView. Після деяких проблем вони видаляють tableView і додають його знову. Що ж відбувається, це те, що headerView - це перше, що є в ієрархії, тому системі більше не потрібно адаптуватися, щоб вирішити проблему. Я знаю, бо використовую лише код, тому в моєму випадку довелося додати спочатку заголовок, а потім таблицю, щоб виправити його.
Lluis Gerard

40

Виберіть перегляд таблиці на своїй дошці та переконайтесь, що для стилю встановлено значення "Звичайний", а не "Згрупований". Ви можете знайти цей параметр на вкладці Атрибути Інспектор.


дивовижно .. це було рішення для мене дивно .. Я просто скопіював і вставив весь контролер перегляду, але якимось чином це вклеєне таблицю контролера видуVV було це дивне зміщення. Ця відповідь вирішила мою проблему
daisura99

Це вирішило проблему, але тепер заголовки поводяться по-різному. Хтось?
Бруно Муніз

Будь здоровий. Де б ти не був у цьому світі. Благословляй тебе назавжди.
габучан

9

У моєму випадку у мене був UILabel під ієрархією перегляду UITableView.

Я перемістив його "вперед" і з'явився порожній пробіл. Не знаю чому, але це працює так, якщо під таблицею View що-небудь є, він ховає порожнє місце.

Також ви можете спробувати перевірити / зняти прапорець "Налаштувати прокрутки для перегляду прокрутки" на інспекторі контролера перегляду на дошці розкадрувань.

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


2
У мене згруповано UITableView і зніміть прапорець "Налаштувати прокрутки для перегляду прокрутки".
Метт

5

НІКОЙ із зазначеного мені не допомогло. але це допомогло :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

замість '-64' ви можете ввести будь-яке інше число залежно від висоти панелі навігації.


4

Можливо, попередньо додано UIRefreshControl. У мене така проблема з таким кодом:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Як бачите, я поставив self.refreshControllerвідразу післяinit

Але якщо ви встановите refreshControlпісля налаштування, то топовий простір вам не заважає.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Я не можу повірити, що це була справжня проблема. Для мене це лише питання на <= 9.3.5. Як у світі ви це зрозуміли?
Сирени

4

Якщо ви робите це на iOS 11, автоматичноAdjustsScrollViewInsets не працюватиме, оскільки його застаріло, наступний код працював для мене відповідно до відповіді в цьому дописі: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Сподіваюся, це допомагає.



3

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

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


3

Я все ще не впевнений, що спричинило додатковий простір у верхній частині, але я виявив, що видалення UITableView з пробілом та заміна його на новий забрав простір.

Я, мабуть, випадково перетягнув UIView, але не зміг його вибрати, щоб не міг видалити.


3

Швидкий 5

Спробуйте видалити tableHeaderView та tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Перевірте свій кадр для перегляду таблиці на раскадровці або xib. У шахті за замовчуванням є значення позиції, отже, помилка


2

У моїй програмі також виникла така проблема. Я встановив нульовий верхній край tableView zero. Також спробували встановити falseдля automaticallyAdjustsScrollViewInsets. Але не вийшло.

Нарешті я отримав робоче рішення. Я не знаю, чи це правильний шлях. Але реалізація heightForHeaderInSectionметоду делегата працювала на мене. Для цього потрібно повернути ненульове значення (повернення нуля відображатиме той самий простір, що і раніше).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

У 2017 році те, що для мене працює, - це просто одна лінія

navigationController? .navigationBar.isTranslucent = false

Я поняття не маю, чому це навіть вплине. Можливо, хтось міг би пояснити. Але я впевнений, що саме ця відповідь шукає більшість людей.


Це зробив і для мене. Дякую!
scurioni

2

В iOS 11 і новіших версіях Apple змінила властивість регулювати введення вмісту. Використання contentInsetAdjustmentBehaviorі встановіть .neverдля видалення додаткового простору вище UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Я сподіваюся, що це вам допоможе.


1

Ну для мене проблема виникла, коли я перетягнув прототипну клітинку з меню в подання таблиці. Тому я видалив це і просто встановив комірку прототипу 1 у властивості інспектора подання таблиці


1

Я роблю це програмно, і я просто перемістив свій addSubview (tableView) донизу після додавання всіх інших моїх підпоглядів, і це вирішило мою проблему!

Не впевнений, чому це відображається лише на пристрої, а не в моєму симуляторі, але в будь-якому випадку є просте рішення!


1

Поки UITableView не є першим підпоглядом контролера перегляду, порожній простір не з’явиться.

Рішення: Додайте об'єкт прихованого / чистого перегляду (представлення, мітки, кнопку тощо) як перший підвід контролера перегляду (на тому ж рівні, що і UITableView, але перед ним).


Я витратив стільки часу, намагаючись розібратися в цьому, пробуючи багато пропозицій тут і в інших публікаціях. Це той, хто її вирішив. Дякую! Чи можете ви пояснити, чому хоч чи опублікувати посилання на якийсь документ, який це робить? Я просто вчу розробки для iOS, і це так відрізняється від Android! :)
Марк

0

UIView можна вставити вгорі та внизу таблиці (перетягування). Встановіть їх властивості як прозорі та висотою 1 пікс. Це для того, щоб прибрати зайві накладки перед клітинками.


0

У мене також була така проблема, що таблиця ViewView не була останньою в ієрархії. У моєму випадку я мав вигляд вище (хоча вони не перетиналися один з одним), тому я перетягнув його над tableView в ієрархії, і це зробило його.


0

Я просто знайшов для цього рішення.

Просто виберіть перегляд таблиці та натисніть Редактор -> Впорядкувати -> Надіслати на фронт

Це працювало на мене і сподіваюся, що допоможе вам усім.


0

У моєму випадку я використовував ContainerViewController і ставив у нього UITableViewController. Після видалення ContainerViewController. Питання відходять.


0

Помилка Xcode 8…

Спробуйте спочатку, якщо для вашого стилю Storyboard UITableView встановлено рівненько.

Встановіть стиль таблиці на "Згруповано", а потім поверніться до "Звичайна". Це видалило місце в моєму додатку на чолі мого UITableView.


0

У моєму випадку я використовував перегляд контейнера. (Головний вигляд -> Перегляд контактора -> UITableView)

Додатковий простір вгорі, я думаю, схожий на простір панелі сповіщень пристрою (де відображається час, акумулятор). Я справді це роблю, це не припущення.

Що я зробив, це був з Інтерфейсу Builder:

  • виберіть завершений контролер подання таблиці
  • Інспектор відкритих атрибутів
  • Перейдіть до -> Переглянути контролер -> Макет -> "Вибрати хоче весь екран"

0

Ви можете використовувати цей код у viewDidLoad або viewDidAppear, де створюється ваша таблиця:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

встановіть ViewController's Extended Edges в аркуші розробки, щоб underTopBarвластивість не була відмічена .


0

Мав те саме питання. Я вирішив це, додавши в viewDidLoad наступне.

self.extendedLayoutIncludesOpaqueBars = true


-2

перевірити для

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • згадайте функцію осередку делегата tableview cellForRowAtIndexPath:
  • він може обробляти і ios 6, і 7.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.