0

カスタム 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 を削除すると、機能し続けます。そのため、イベントをフックすると何かが壊れるか、リセットのために何かを呼び出す必要があるようです。

提案をいただければ幸いです:)

よろしく

4

1 に答える 1

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
        }
        );
    }
于 2013-10-30T07:08:41.003 に答える