Кажется, есть некоторая проблема с тем, как UICollectionView прокручивает SetContentOffset с пользовательской анимацией, когда Пейджинг включен.
Когда полная ширина страницы (CardCollectionView.Frame.Width
) берется как расстояние, которое нужно прокрутить,
var distanceToScroll = CardCollectionView.Frame.Width * (pageControlIndex - sourceIndex);
и используется в SetContentOffset,
CollectionView.SetContentOffset(
new CGPoint(CollectionView.ContentOffset.X + distanceToScroll, CollectionView.ContentOffset.Y),
false);
, тогда оно не будет анимироваться так, как при использовании пользовательских анимаций.
Решение:
Вы не должны настраивать анимацию для полной ширины страницы расстояния прокрутки, вместо этого вы должны уменьшить расстояние прокрутки на 1 пиксель (выбрав 1 пиксель, чтобы сделать его менее заметным, подойдет и любая другая сумма) из полной ширины страницы .То есть
var distanceToScroll = (CardCollectionView.Frame.Width - 1) * (pageControlIndex - sourceIndex);
-1 в CardCollectionView.Frame.Width - 1
- это так называемый обходной путь.
Затем вы должны решить эту проблему после анимации.То есть в приведенном выше коде UIView.Animate функция обратного вызова должна иметь одну дополнительную строку:
CardCollectionView.SetContentOffset(
new CGPoint(CardCollectionView.ContentOffset.X + (pageControlIndex - sourceIndex), CardCollectionView.ContentOffset.Y),
false);
Тогда UIView.Animate будет выглядеть так:
UIView.Animate(0.5, 0, UIViewAnimationOptions.TransitionNone,
() =>
{
CollectionView.SetContentOffset(
new CGPoint(CollectionView.ContentOffset.X + distanceToScroll, CollectionView.ContentOffset.Y),
false);
},
() =>
{
CardCollectionView.SetContentOffset(
new CGPoint(CardCollectionView.ContentOffset.X + (pageControlIndex - sourceIndex), CardCollectionView.ContentOffset.Y),
false);
CollectionSource.DecelerationEnded(CollectionView);
});
Теперь пользовательская анимация будет работать очень плавно ?