使用xamarin.ios和mmvmcross v3的UICollectionView问题

时间:2013-10-25 07:58:31

标签: xamarin.ios uicollectionview mvvmcross

我们有一个使用自定义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它继续工作。所以它似乎挂断了事件,或者我需要调用一些东西进行重置。

我希望你有一个建议:)

此致

1 个答案:

答案 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
        }
        );
    }