我们有一个使用自定义MvxCollectionViewSource作为源的UICollectionView。选择项目时,我们想要滚动到项目,做一个简短的动画,然后做一个动作。在源中,ItemSelected被覆盖如下,其中为ScrollAnimationEnded设置了一个事件。
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它继续工作。所以它似乎挂断了事件,或者我需要调用一些东西进行重置。
我希望你有一个建议:)
此致
答案 0 :(得分:0)
我还没有找到解决方案,因为设置事件似乎会削减其他内容。但是我做了一个解决方法,而不是使用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
}
);
}