Прокрутите программно UITableView с ускорением и замедлением - PullRequest
6 голосов
/ 12 октября 2011

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

Сначала я попытался использовать scrollToRowAtIndexPath: atScrollPosition: animated: однако это слишком быстро и исправлено во времени. Также нет ускорения и замедления.

Есть идеи, как прокрутить UITableView программно, так как он был прокручен вручную? Я думал отправить ему несколько пользовательских штрихов . Как вы думаете, это может сработать?

Любые идеи и помощь с благодарностью! Спасибо!

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

UITableview является подклассом UIScrollview. Подобно UIScrollview, вы можете программно установить позицию прокрутки UITableview, установив свойство contentOffset.

Вы изменяете значение этого свойства внутри блока анимации, чтобы иметь больше контроля над временем. Вам нужно будет рассчитать положение точки Y. Скажем, вы хотите прокрутить до 50-й строки, это может быть 50 * rowHeight (при условии, что это одинаковая высота).

Например:

CGFloat calculatedPosY = 50 * rowHeight // do you own calculation of where you'd like it.
[UIView animateWithDuration:0.2
     animations:^{theTableview.contentOffset = CGPointMake(0.0, calculatedPosY);}
     completion:^(BOOL finished){ }];

Есть еще один метод, который вы можете использовать, который также предоставляет больше возможностей

Взгляните на этот метод:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
6 голосов
/ 20 февраля 2012

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

  CGPoint point = [button.superview convertPoint:button.frame.origin toView:self.tableView];
  CGPoint contentOffset = self.tableView.contentOffset;
  contentOffset.y += (point.y - contentOffset.y - self.navigationController.navigationBar.frame.size.height); // Adjust this value as you need
  [self.tableView setContentOffset:contentOffset animated:YES];
2 голосов
/ 12 октября 2011

Что ж, это всего лишь пара «ответов из головы», но вы можете попробовать использовать этот метод (в UIScrollView, из которых UITableView является подклассом):

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

Как только -(CGRect) rectForRowAtIndexPath: даст вам координаты ячейки, вы можете анимировать ее местоположение. Но вместо того, чтобы вызывать его один раз, назовите его пару раз с меньшим смещением, затем с большим и большим смещением, а затем снова с меньшим. Я боюсь, что будет трудно заставить его выглядеть гладким.

Тем не менее, если это не сработает, возможно, сработает изменение значения contentOffset внутри блока UIView animateWithDuration:delay:options:animations:completion. Возможно, если вы используете UIViewAnimationOptionCurveEaseInOut, вы можете получить желаемый эффект, просто вызвав его один раз. Если нет, запустите несколько анимаций в каждой части пути и преодолевайте большие и большие расстояния, прежде чем замедляться.

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