Я вижу какое-то загадочное поведение UICollectionView
с пользовательским макетом (подкласс UICollectionViewLayout
) при повороте устройства.
У меня есть простой горизонтально прокручиваемый ряд ячеек. При повороте устройства из портретной в альбомную ориентацию становятся видны дополнительные ячейки, которых раньше не было видно, а анимация этих появляющихся ячеек неправильная (используется знакомый эффект ореола, который, как я думаю, является своего рода эффектом анимации по умолчанию для просмотра коллекции). макеты). Обратите внимание на ячейку, появляющуюся в крайнем левом углу этой анимации:
Некоторые подробности о настройке пользовательского макета:
shouldInvalidateLayoutForBoundsChange:
возвращаетYES
.- In
layoutAttributesForItemAtIndexPath:
кэширует атрибуты в словаре, если они еще не созданы. - В
layoutAttributesForElementsInRect:
я рассчитываю вручную, какие ячейки должны быть видны, и каждый раз немного подстраиваю их свойствоcentre
, прежде чем возвращать их атрибуты.
Затем у меня есть следующий код для работы с начальными/конечными атрибутами макета:
- (void)prepareForAnimatedBoundsChange:(CGRect)oldBounds
{
[super prepareForAnimatedBoundsChange:oldBounds];
self.animatingBoundsChange = YES;
}
- (void)finalizeAnimatedBoundsChange
{
[super finalizeAnimatedBoundsChange];
self.animatingBoundsChange = NO;
}
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, appearing items should animate from their current attributes (specify `nil`).
// Both of these appear to do much the same thing:
//return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
return nil;
}
return [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
if (self.animatingBoundsChange) {
// If the view is rotating, disappearing items should animate to their new attributes.
return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}
return [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath];
}
Мне кажется, что начальные атрибуты макета для вновь появляющейся ячейки какие-то неправильные (в конце концов, она заканчивается в правильном месте). Но когда я регистрирую свойство center
атрибутов макета, возвращенных из метода initalLayout...
, все выглядит правильно — все равномерно распределено по горизонтальной оси.
Единственная отличительная особенность ячейки, которая не анимируется правильно, заключается в том, что ее ячейка не возвращается в массиве [collectionView visibleCells]
при вызове метода initialLayout...
. Однако layoutAttributesForElementsInRect:
, который предшествует ему, правильно определяет, что его атрибуты макета необходимы.
Так что же происходит? Некоторое понимание того, что происходит под капотом, было бы очень полезно... UICollectionView
похоже на массивный черный ящик.
initial/finalLayout...
вызываются при чередовании, и фактически они подтверждают, что добавление кода, как указано выше, предотвращает анимацию плавного затухания. Этот вопрос касается дополнительных ячеек, представленных после анимированного изменения границ. - person Stuart   schedule 03.11.2013initial/finalLayout...
. Я не понимаю, почему появляющаяся ячейка не может плавно анимироваться, если задана начальная позиция. - person Stuart   schedule 03.11.2013