Подтвердить что ты не робот

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

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

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

tableView.contentOffset = CGPointMake(0, savedScrollPosition);

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

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

4b9b3361

Ответ 1

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

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

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

ИЛИ

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

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

Ответ 2

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

Ответ 3

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

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

    }

Ответ 4

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

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

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

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

Ответ 5

Я использовал подход Кори. Я сохраняю и восстанавливаю прямоугольники со словарным представлением. Кроме того, это может быть не очевидно, но прямая для сохранения и восстановления - это границы 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 *

Ответ 6

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

Ответ 7

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

Ответ 8

Это была моя проблема, когда у меня был 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

Ответ 9

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

Ответ 10

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

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

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