Программно заставить UIScrollView прекратить прокрутку для совместного использования табличного представления с несколькими источниками данных - PullRequest
25 голосов
/ 12 июня 2009

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

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

tableView.contentOffset = CGPointMake(0, savedScrollPosition);

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

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

Ответы [ 10 ]

19 голосов
/ 12 июня 2009

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

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

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

OR

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

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

13 голосов
/ 12 июня 2009

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

5 голосов
/ 18 апреля 2012

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

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

    }
4 голосов
/ 11 августа 2010

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

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

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

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

2 голосов
/ 18 мая 2010

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

0 голосов
/ 07 апреля 2017

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

0 голосов
/ 15 сентября 2010

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

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
0 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...