使用xamarin.ios和mmvmcross v3的UICollectionView出现问题
我们有一个使用自定义MvxCollectionViewSource作为源的UICollectionView。当选择一个项目时,我们想滚动到第个项目,做一个简短的动画,然后做一个动作。在源代码中,如果为ScrollAnimationEnded设置了事件,则ItemSelected将被覆盖,如下所示使用xamarin.ios和mmvmcross v3的UICollectionView出现问题,xamarin.ios,uicollectionview,mvvmcross,Xamarin.ios,Uicollectionview,Mvvmcross,我们有一个使用自定义MvxCollectionViewSource作为源的UICollectionView。当选择一个项目时,我们想滚动到第个项目,做一个简短的动画,然后做一个动作。在源代码中,如果为ScrollAnimationEnded设置了事件,则ItemSelected将被覆盖,如下所示 public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath) {
public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
{
var item = GetItemAt(indexPath) as SlideMenuViewItemModel;
var cell = collectionView.VisibleCells[0];
var index = collectionView.IndexPathForCell(cell);
if (!Equals(index, indexPath))
{
collectionView.ScrollAnimationEnded += HandleAnimationDone;
collectionView.ScrollToItem(indexPath, UICollectionViewScrollPosition.CenteredHorizontally, true);
}
else
{
var layout = (SlideMenuLayout)collectionView.CollectionViewLayout;
layout.SelectedIndexPath = indexPath;
collectionView.PerformBatchUpdates(delegate { }, delegate
{
item.OnClick.Execute(null);
layout.SelectedIndexPath = null;
});
}
}
private void HandleAnimationDone(object sender, EventArgs args)
{
CollectionView.ScrollAnimationEnded -= HandleAnimationDone;
var layout = (SlideMenuLayout)CollectionView.CollectionViewLayout;
CollectionView.PerformBatchUpdates(delegate { }, delegate
{
// item.OnClick.Execute(null);
layout.SelectedIndexPath = null;
});
}
问题是它只在第一次起作用。选择该项目并执行滚动并触发事件。但是,当尝试进行下一次选择时,不会调用ItemSelected。如果我删除collectionView.ScrollAnimationEnded+=HandleAnimationDone行,它将继续工作。所以连接事件似乎会破坏一些东西,或者我需要调用一些东西进行重置
我希望你有一个建议:)
关于我还没有找到解决方案,因为设置事件似乎切断了其他事情。但是我做了一个变通,没有使用ScrollToItem和设置动画结束事件,而是做了一个自定义滚动动画。下面展示了我是如何做到这一点的
public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
{
var item = GetItemAt(indexPath) as SlideMenuViewItemModel;
var cell = GetCell (collectionView, indexPath);
CurrentIndex = indexPath;
UIView.Animate (0.5, 0, UIViewAnimationOptions.CurveEaseIn,
() => {
// do any animation
},
() => {
//do anything after the animation
}
);
}