2013-10-25 4 views
0

У нас есть UICollectionView с использованием пользовательского источника MvxCollectionViewSource в качестве источника. При выборе элемента мы хотим прокрутить до пункта, сделать короткую анимацию, а затем выполнить действие. В источнике ItemSelected переопределяется следующим образом, где событие установлено для ScrollAnimationEnded.Проблема с UICollectionView с использованием xamarin.ios и mmvmcross v3

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

я не нашел решение, как это кажется, что установка события вырезать что-то другое прочь. Однако я работал над обходом, вместо использования 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 
     } 
     ); 
    } 
Смежные вопросы