Как я могу остановить UITable от переопределения смещения контента, которое я установил, когда оно замедляется? - PullRequest
1 голос
/ 24 октября 2011

У меня есть таблица, для которой я делаю специальную загрузку.Пользователь начинает прокручиваться вниз.Когда пользователь прокручивает вверху страницы, я обнаруживаю это с помощью методов делегирования представления прокрутки, и я быстро загружаю некоторый дополнительный контент и заполняю большую часть верхней части списка.Я хочу, чтобы это выглядело безупречно, как «бесконечный свиток» вверх.Для этого мне нужно установить смещение контента, чтобы пользователь не видел, как таблица «прыгает» вверх.Когда я медленно прокручиваю, это работает отлично.Когда я прокручиваю быстро, чтобы таблица замедлялась, смещение содержимого, которое я установил, игнорируется.Вот код, который я использую:

CGFloat oldHeight = self.tableView.contentSize.height;
CGFloat oldOffset = self.tableView.contentOffset.y;
self.tableContentsArray = newTableContentsArray;
[self.tableView reloadData];
CGFloat newHeight = self.tableView.contentSize.height;
CGFloat newOffset = oldOffset + (newHeight - oldHeight);
self.tableView.contentOffset = CGPointMake(0, newOffset);

Так что, если я быстро прокручиваю вверх с таблицей высотой 100px и достигаю вершины при замедлении, я загружаю больше данных, получаю новую высоту таблицы, скажем,250px.Я установил смещение на 150. Однако, поскольку оно все еще замедляется, код Apple оставляет смещение, установленное на 150, на 0,1 секунды или около того, затем переходит к следующему вычисленному смещению для замедления и устанавливает смещение на 0, что делает егоПосмотрите на пользователя, как будто он только что пропустил 150px контента и теперь находится в новой верхней части списка.

Теперь я ЛЮБЛЮ, чтобы сохранить ускорение в списке, чтобы оно продолжало растив то время как, замедляется и заканчивается где-то около 120px смещения, как вы и ожидали.Вопрос в том, как?

Если я использую [self.tableView setContentOffset: CGPointMake(0, newOffset) animated: NO];, это останавливает игнорирование смещения содержимого, но останавливает список мертвым.

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

У нас была такая интересная ситуация на работе несколько месяцев назад. Мы хотели использовать UITableViewController из-за его кэширования, загрузки и анимации, но мы хотели, чтобы он прокручивался горизонтально (в вашем случае это будет прокрутка вверх). Решение? Поверните стол, затем поверните ячейки в другом направлении.

В вашем случае код будет выглядеть так:

#define degreesToRadian(x) (M_PI * (x) / 180.0) в шапке

- (void) viewDidLoad {
   [super viewDidLoad];
   self.table.transform = CGAffineTransformMakeRotation(degreesToRadian(-180));
   ...
}

Затем поверните ячейку, чтобы она оказалась в правильной ориентации для пользователя

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
}

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

0 голосов
/ 24 октября 2011

Боюсь, вы пытаетесь делать слишком сложные вещи, не понимая их по-настоящему.

У вас действительно есть бесконечный стол или очень длинный стол? Я думаю, что можно было бы просто сказать таблице, что она имеет 1000000 ячеек. Каждая ячейка загружается, когда вам это нужно. И это в основном то, что вы хотите сделать.

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