У меня есть подкласс UIScrollView. Его содержимое многократно используется - около 4 или 5 просмотров используются для отображения сотен элементов (при повторном прокрутке скрытых объектов и переходе на другую позицию, когда это необходимо для их просмотра)
Что мне нужно: возможность автоматического прокрутки моего прокрутки до любой позиции. Например, в моем представлении прокрутки отображается 4-й, 5-й и 6-й элементы, и когда я нажимаю какую-то кнопку, ему нужно прокрутить до 30-го элемента. Другими словами, мне нужно стандартное поведение для UIScrollView.
Это отлично работает:
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
но мне нужна настройка. Например, измените продолжительность анимации, добавьте некоторый код для выполнения в конце анимации.
Очевидное решение:
[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self setContentOffset:CGPointMake(index*elementWidth, 0)];
} completion:^(BOOL finished) {
//some code
}];
но у меня есть некоторые действия, связанные с событием прокрутки, и теперь все они находятся в блоке анимации, и это заставляет все подкадры также оживлять (благодаря нескольким многократно используемым элементам все они оживляют не то, как я хочу)
Вопрос: Как создать пользовательскую анимацию (на самом деле мне нужна пользовательская продолжительность, действия на конец и параметр BeginFromCurrentState) для смещения содержимого БЕЗ анимирования всего кода, связанный с событием scrollViewDidScroll
?
UPD:
Благодаря Andrew answer (первая часть) я решил проблему с анимацией внутри scrollViewDidScroll
:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[UIView performWithoutAnimation:^{
[self refreshTiles];
}];
}
Но scrollViewDidScroll
должен (для моих целей) исполняет каждый кадр анимации, как это было в случае
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Однако теперь он выполняется только один раз при запуске анимации.
Как я могу это решить?