Я попытался установить продолжительность (с обычными методами, которые я бы попробовал) для установки продолжительности анимации для метода UICollectionView selectItemAtIndexPath:animated:scrollPosition:
(или метода scrollToItemAtIndexPath:atScrollPosition:animated:
). Я пробовал [UIView setAnimationDuration]
, и я попробовал обернуть его в CATransaction
. Я не увенчался успехом до этого, чтобы изменить продолжительность анимации (хотя я признаю, что мог ошибиться в этой логике).
Мысли?
ОБНОВЛЕНИЕ:
Я пробовал здесь множество подходов. Самое близкое решение - сделать то, что мы обычно делали бы для анимации UIScrollView
(путем установки анимированного аргумента: NO
и упаковки его в блок анимации UIView
). Это отлично работает для scrollview. Однако, по какой-то причине это винты с процессом создания UICollectionView
.
Я привел пример ниже, используя два подхода. Каждый подход предполагает, что у вас есть 4 раздела с 4 элементами в каждом разделе. Кроме того, анимация предполагает, что вы перемещаетесь от 0,0 до 3,3.
Использование анимации по умолчанию
Часть вопроса здесь, безусловно, связана с UICollectionView
. Если вы примете следующий подход (используя параметр анимации по умолчанию) - все работает нормально:
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:3 inSection:3]
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:YES];
Когда это выполняется, каждая ячейка между текущими видимыми ячейками и ячейкой назначения создается. Я включил запись в метод collectionView:cellForItemAtIndexPath:
:
2013-05-18 09:33:24.366 DEF-CV-Testing[75463:c07] Transition
Cell Created for Index Path: <NSIndexPath 0x8913f40> 2 indexes [0, 1]
Cell Created for Index Path: <NSIndexPath 0x75112e0> 2 indexes [0, 2]
Cell Created for Index Path: <NSIndexPath 0xfe1a6c0> 2 indexes [0, 3]
Cell Created for Index Path: <NSIndexPath 0x89159e0> 2 indexes [1, 0]
Cell Created for Index Path: <NSIndexPath 0x8a10e70> 2 indexes [1, 1]
Cell Created for Index Path: <NSIndexPath 0x7510d90> 2 indexes [1, 2]
Cell Created for Index Path: <NSIndexPath 0x75112a0> 2 indexes [1, 3]
Cell Created for Index Path: <NSIndexPath 0x8915a00> 2 indexes [2, 0]
Cell Created for Index Path: <NSIndexPath 0x75111c0> 2 indexes [2, 1]
Cell Created for Index Path: <NSIndexPath 0xfe17f30> 2 indexes [2, 2]
Cell Created for Index Path: <NSIndexPath 0xfe190c0> 2 indexes [2, 3]
Cell Created for Index Path: <NSIndexPath 0xfe16920> 2 indexes [3, 0]
Cell Created for Index Path: <NSIndexPath 0x75112a0> 2 indexes [3, 1]
Cell Created for Index Path: <NSIndexPath 0xfe1a4f0> 2 indexes [3, 2]
Cell Created for Index Path: <NSIndexPath 0x75142d0> 2 indexes [3, 3]
Использование пользовательской анимации
При переносе метода scrollToItemAtIndexPath:
в блок анимации UIView
элементы создаются неправильно. См. Пример кода здесь:
[UIView animateWithDuration:5.0 delay:0.0 options:0 animations:^{
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:3 inSection:3]
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:NO];
} completion:^(BOOL finished) {
NSLog(@"Completed");
}];
В настоящее время видимые ячейки исчезают, и создается только целевая. Я включил тот же журнал в метод collectionView:cellForItemAtIndexPath:
:
Transition
Cell Created for Index Path: <NSIndexPath 0x71702f0> 2 indexes [3, 3]
Completed