Как отключить прокрутку в таблице 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 Я думаю, вы пропустили точку зрения ОП. Вопрос не в том, как отключить отскок, а в том, чтобы включить прокрутку (и, скорее всего, отскок), когда просмотр таблицы необходимо прокрутить.
Кайл Клегг
Может быть, лучше использовать границы, потому что я думаю, что если вы немного повернете свою таблицу, frame.height изменится.
Рикардо
Должно быть: if (table.contentSize.height <= table.frame.size.height)
Гжегож Круковски,

Ответы:

396

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

tableView.alwaysBounceVertical = NO;
Лили Баллард
источник
6
Это работает лучше, чем contentSize <frame, когда вы используете AutoLayout. Должен быть принят ответ.
Джошуа Дэнс
1
Я использую автоматическое расположение, и этот ответ - именно то, что мне нужно.
Золотой палец
3
лучше, чем отключение прокрутки
Кирит Вагела
5
работает как шарм, вы также можете отключить его interface builder, сняв отметки отказов и отказов по горизонтали / вертикали.
Асан Эбрахим
11
для Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Вы можете проверить количество видимых ячеек, используя эту функцию:

- (NSArray *)visibleCells

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

tableView.scrollEnabled = NO;

Как уже упоминалось @ Джинни .. у нас могут быть проблемы с частично видимыми ячейками, поэтому это решение работает лучше в этом случае:

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

В случае, если вы используете autoLayout, это решение делает работу:

tableView.alwaysBounceVertical = NO.
Роберто Ферраз
источник
Спасибо! Это в основном работает для меня сейчас. Единственная проблема, с которой я сталкиваюсь сейчас, это когда ячейки частично видны, они все еще считаются видимыми, и поэтому прокрутка отключается, когда в этом случае я хочу, чтобы она была включена.
Джинни
6
Догадаться! Оказывается, вы вообще не можете использовать visibleCells из-за частично видимой проблемы с ячейкой, но это работает: if (table.contentSize.height < table.frame.size.height)>> см. Редактирование в оригинальном сообщении.
Джинни
42

В Свифте:

tableView.alwaysBounceVertical = false
Нативидад Лара Диас
источник
18
Я всегда приветствую такие «переписывания», потому что преобразование в современный синтаксис требует времени.
Дмитрий Исаев
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
 }
Hemang
источник
13

попробуй это

[yourTableView setBounces:NO];
codercat
источник
@kyle - спасибо за примечание! - но посмотрите, это то, что происходит автоматически. Если он короче экрана (или другого держателя), он НЕ прокручивается (и, очевидно, не будет отскакивать, потому что он даже не будет прокручиваться). Если он длиннее экрана, он будет прокручиваться (и даже отскакивать). Нет ??
Толстяк
Может быть, я слишком часто использую представления коллекций ... может быть, это работает, как я описываю для представлений коллекции, но не для UITableView ??
Толстяк
9

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

Прокрутка Просмотр области редактирования

Акила Васала
источник
3

Вы можете редактировать это в вашей раскадровке (если вы используете один). Под табличным представлением есть флажок «Прокрутка включена». Снимите флажок, и все готово.

ericmarkmartin
источник
3

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

rjobidon
источник
3
Я думаю, что я был просветлен после прочтения вашего решения. Большое спасибо
Араш
Я использовал это в своем представленииDidAppear
Мария
1
Я имел в виду viewDidLayoutSubviews не viewDidAppear
Мария
0

Высота ячейки по умолчанию составляет 44.0f для ячейки табличного представления, я считаю. Вы должны иметь свой источник данных в руках в массиве? Затем просто проверьте, [array count]*44.0fвыходит ли за границы кадра и, если это так tableview.scrollEnabled = NO, установите его в YES. Сделайте это там, где вы определите источник данных для этого конкретного табличного представления.

Bourne
источник
Ячейки таблицы имеют разные размеры (и могут изменить размер в любое время; я использую метод heightForRowAtIndexPath), поэтому я, вероятно, не захочу жестко кодировать 44.0f. Я считаю, что это число совпадает с tableView.rowHeight в любом случае?
Джинни
Затем вы будете делать общий расчет высоты в этом методе. Просто верно? Если это превышает границы экрана, включите прокрутку, иначе оставьте ее отключенной. Метод будет вызван для всех видимых ячеек. Если у вас недостаточно данных, чтобы выйти за пределы экрана, вы можете рассчитать общую высоту прямо в этом методе. Продолжайте добавлять к глобальной переменной высоту, которую она возвращает при каждом вызове, и у вас есть общая высота.
Борн
Ответ Роберто - это более простой способ достичь всего этого и оставить расчет за столом.
Борн