2009-06-12 1 views
25

У меня есть UITableView, чей источник данных и делегат переключаются между несколькими пользовательскими объектами источника данных, когда пользователь касается сегментированного элемента управления (подумайте «Вверх Paid "vs" Top Free "в приложении App Store).Программно заставить UIScrollView прекратить прокрутку, для совместного использования табличного представления с несколькими источниками данных

Каждый объект источника данных сохраняет его содержимое последней прокрутки смещения, и восстанавливает его, когда он становится активным источником данных для представления таблицы, выполнив:

tableView.contentOffset = CGPointMake(0, savedScrollPosition); 

Это хорошо работает, когда пользователь переключает источник данных, когда таблица находится в состоянии покоя, но если пользователь попадает в сегментированный элемент управления, пока таблица все еще перемещается (т.е. замедляется), представление таблицы продолжает замедляться от старого смещения, что фактически отменяет мое назначение contentOffset.

Есть ли способ заставить просмотр таблицы прекратить прокрутку/замедление, когда я устанавливаю contentOffset, или другой способ заставить этот вид таблицы данных с переключаемым источником данных работать?

ответ

19

Вы попробовали эти 2 метода?

Фактически они применяются к «прокрутке», а не только к смещению содержимого.

[self.tableView scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

ИЛИ:

[self.tableView scrollRectToVisible:savedFrame animated:NO]; 

Они должны фактически осуществлять прокрутку и выдвижением ускорение таблицы, а не только то, что видно на экране монитора.

+2

scrollRectToVisible сделал это, используя сохраненную позицию прокрутки в качестве источника прямоугольника и используя границы табличного представления как высоту. Вы абсолютно правы, что методы прокрутки * управляют ускорением способами настройки смещения содержимого. –

+0

'scrollRectToVisible' работал и на меня. – zekel

-3

Вы могли бы попробовать сделать

tableView.scrollEnabled = NO; 
tableView.scrollEnabled = YES; 

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

+0

Я попытался установить его на NO , затем установите значение contentOffset, затем верните его в YES. Это не сработало, но я мог бы попробовать последовательность NO-YES-offset и посмотреть, не изменилось ли это. –

0

Вы можете дождаться, когда свойство «замедления» станет НЕТ (например, с помощью KVO) и переключится после этого.

+0

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

13

Вы пытались использовать [view setContentOffset: offset animated: YES]?

+0

Я сделаю снимок. Это не совсем то поведение, которое я хочу (я хочу, чтобы положение прокрутки сразу щелкнуло), но это может быть достаточно хорошим. –

+8

Это сработало для меня, используя анимированные: NO. –

+0

анимированный сделал – Eugene

0

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

2

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

// Save the current tableview bounds 
CGRect contentRect = self.listTableView.bounds; 
if (!!oldScope) [_contentRects setObject:(NSObject *)CGRectCreateDictionaryRepresentation(contentRect) forKey:oldScope]; 

// Restore if possible 
CFDictionaryRef restoredFrameDict = (CFDictionaryRef)[_contentRects objectForKey:newScope]; 
if (!restoredFrameDict) restoredFrameDict = CGRectCreateDictionaryRepresentation(CGRectZero); 
CGRectMakeWithDictionaryRepresentation(restoredFrameDict, &contentRect); 

// Switch over to new datasource 
self.listTableView.dataSource = [self dataSourceForScope:newScope]; 
[self.listTableView reloadData]; 

// Restore content offset for "newScope"; Also stops scrolling 
[self.listTableView scrollRectToVisible:contentRect animated:NO]; 

Примечание сменного использование CFDictionaryRef и NSDictionary *

4

Просто нашли это ищет пути остановите мой UIScrollView - мне нужно было переместить некоторые подзаголовки вокруг, но эта рана выглядит правильно, если пользователь щелкнул по экрану, и он все еще замедлялся.

В любом случае - scrollRectToVisible не работал для меня (может быть, потому, что я не пользуюсь табличным представлением ??), но это сработало отлично:

[mainScrollView setContentOffset:CGPointMake(mainScrollView.contentOffset.x, mainScrollView.contentOffset.y) animated:NO]; 

После этого я могу сделать материал подзапроса, не беспокоясь!

0

Это была моя проблема, когда у меня был UISwitch в качестве селектора для таблиц. Но с сегментированным контролем у меня нет никаких проблем. Может быть, вы не перезагрузили стол? Это мой кусок рабочего кода:

NSIndexPath *exPath = [[subTable indexPathsForVisibleRows] lastObject]; 

isMatchOn = [whatList selectedSegmentIndex] == 0 ? YES : NO; //table source will make the choice looking at this BOOL 

[subTable reloadData]; // here tables actually flip 

if (lastPosition) { 
    [subTable scrollToRowAtIndexPath:lastPosition atScrollPosition:UITableViewScrollPositionBottom animated:NO]; //I scroll to saved index 
    } 
self.lastPosition = exPath; //here I save the current position 
5

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

if (self.tableView.isDecelerating) { 
     NSArray *paths = [self.tableView indexPathsForVisibleRows]; 
     [self.tableView scrollToRowAtIndexPath:[paths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

    } 
0

Вы также можете сделать self.tableView.isScrollEnabled = true/false когда вы дойдете до определенного tableView.contentOffset.y значения

Смежные вопросы