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


240

У моєму додатку для iphone є декілька таблиць (згрупованих стилів) (лише на частині екрана та додано, Interface Builderхоча не підкласи UITableViewController), що 80% часу є маленькими, і вони вмістяться на екрані. Коли таблиця розміститься на екрані, я хотів би відключити прокрутку, щоб зробити її трохи чистішою. Але якщо таблиця вимикається з екрана (коли рядки згодом додаються до неї), я б хотів знову включити прокрутку (бо в іншому випадку ви не бачите цього вмісту.)

Чи є спосіб це зробити? Я не можу це зрозуміти. Я знаю, що робити:

tableView.scrollEnabled = NO;

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


Оновлення : Ось рішення, яке нарешті спрацювало для мене:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Я запускаю цей код після дзвінка reloadDataпо таблиці, і він обчислює потрібні розміри і, здається, працює.

table.frame.size.height- це фактичний розмір об'єкта (ви можете побачити це в Interface Builder), що відображається на екрані, тоді table.contentSize.heightяк висота: заголовок, колонтитул та висота кожної комірки, що додаються разом.


1
Дякую. Це рішення працювало на мене. Однак я розширив UITableView і переосмислив reloadData для відключення scrollEnabled. Причина полягає в тому, що подання таблиці завантажується під час створення мого контролера перегляду. Таким чином, вам не доведеться викликати reloadData двічі.
Брендон О'Рурке

@JoeBlow Я думаю, що ти пропустив пункт OP. Питання полягає не в тому, як відключити відмов, а в тому, як увімкнути прокрутку (і, швидше за все, підстрибувати) тоді, коли потрібно переглянути простір.
Кайл Клегг

Можливо, краще використовувати межі, тому що я думаю, якщо трохи обернути стіл, frame.height зміниться.
Рікардо

Має бути: якщо (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Відповіді:


396

Я думаю, ти хочеш встановити

tableView.alwaysBounceVertical = NO;

6
Це працює краще, ніж contentSize <frame, коли ви використовуєте AutoLayout. Слід прийняти відповідь.
Танець Джошуа

1
Я використовую автоматичний макет, і ця відповідь саме те, що мені потрібно.
Золотий палець

3
краще, ніж відключення прокрутки
Kirit Vaghela

5
працює як принадність, ви також можете відключити його від interface builderнеперевершеного відскоку та відскоку горизонтально / вертикально.
Ахсан Ебрагім

11
для Swift - tableView.alwaysBounceVertical = false
swiftBoy

44

Ви можете перевірити кількість видимих ​​комірок за допомогою цієї функції:

- (NSArray *)visibleCells

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

tableView.scrollEnabled = NO;

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

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

Якщо ви використовуєте autoLayout, це рішення виконайте цю роботу:

tableView.alwaysBounceVertical = NO.

Дякую! Зараз це в основному для мене працює. Єдина проблема, яка у мене зараз є, коли клітини частково помітні, вони все ще вважаються видимими, і, таким чином, прокрутка вимикається, коли в такому випадку я хочу, щоб вона була включена.
Джінні

6
Зрозумів це! Виявляється, ви не можете реально використовувати vidCells взагалі через частково видиму проблему комірок, але це працює: if (table.contentSize.height < table.frame.size.height)>> див. Редагування в оригінальному дописі.
Джінні


14

Отже, є кілька відповідей, і потрібен весь вміст одразу, тому я додаю цю відповідь:

Якщо ви використовуєте функцію AutoLayout, встановивши це, вам слід працювати лише:

  • У коді:

tableView.alwaysBounceVertical = false

  • або Інтерфейс:

Просто знайдіть цей варіант та untick" Bounce Vertically" варіант.

Ось посилання:

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

Якщо ви не використовуєте AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

спробуйте це

[yourTableView setBounces:NO];

@kyle - дякую за замітку! - але дивіться, що це відбувається автоматично. Якщо він коротший за екран (або інший тримач), він НЕ прокручується (і, очевидно, не відскакує, тому що він навіть не прокручує). Якщо він довший за екран, він буде прокручуватися (і справді відскакувати). Немає??
Fattie

Можливо, я занадто багато використовував перегляди колекції ... можливо, це працює так, як я описую для переглядів колекції, але не для UITableView ??
Fattie

9

Ви можете встановити ввімкнути / вимкнути відмов або прокрутити табличний перегляд, вибравши / скасувавши вибір у області Перегляд прокрутки.

Прокрутіть область Перегляд редагування


3

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


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
Я думаю, що я просвітився, прочитавши ваше рішення. Велике спасибі
Араш

Я використав це в моєму поглядіDidAppear
Марія

1
Я мав на увазі viewDidLayoutSubviews не переглядатиDidAppear
Марія

0

Висота за замовчуванням - 44,0f для комірки табличного перегляду, я вважаю. Ви, мабуть, матимете свій джерело даних у масиві в масиві? Потім просто перевірте, чи не [array count]*44.0fвиходить вона за межі кадру, і якщо так встановлено tableview.scrollEnabled = NO, інакше встановіть це ТАК. Зробіть це там, де ви визначите джерело даних для конкретного перегляду таблиці.


Клітини моєї таблиці мають різний розмір (і можуть змінювати розмір у будь-який час; я використовую метод heightForRowAtIndexPath), тому, напевно, я б не хотів жорсткого коду 44.0f. Я вважаю, що число все одно таке, як tableView.rowHeight?
Джінні

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

Відповідь Роберто - це простіший спосіб досягти всього цього і залишити обчислення таблиці.
Борн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.