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