0

当我将一个单元格拖到 CollectionView 边界之外时,我遇到了一些奇怪的行为(实际上是崩溃)。如何将 CollectionView 的用户交互限制为仅 CollectionView 的框架?当用户长按并拖动视图单元格时,我只希望他们能够在 CollectionView 中移动单元格,而不是在整个屏幕上移动

private void HandleLongPressOnCollection(UILongPressGestureRecognizer gesture)
{
    switch (gesture.State)
    {
        case UIGestureRecognizerState.Began:
            var myIndexPath = MyCollectionView.IndexPathForItemAtPoint(gesture.LocationInView(MyCollectionView));
            this.selectedIndexPath = myIndexPath;

            BeginInteractiveMovementForItem();
            break;
        case UIGestureRecognizerState.Changed: // This is not working correctly
            if (MyCollectionView.Frame.Contains(gesture.LocationInView(MyCollectionView)))
            {
                MyCollectionView.UpdateInteractiveMovement(gesture.LocationInView(MyCollectionView));
            }
            break;
        case UIGestureRecognizerState.Ended:
            EndInteractiveMovementForItem();
            break;
        default:
            MyCollectionView.CancelInteractiveMovement();
            break;
      }
}


private void BeginInteractiveMovementForItem()
{
  if (selectedIndexPath != null)
  {
    MyCollectionView.BeginInteractiveMovementForItem(selectedIndexPath);

    var cell = MyCollectionView.CellForItem(selectedIndexPath) as CustomViewCell;
    cell.MarkCellAsMoving();
  }
}

private void EndInteractiveMovementForItem()
{
  if (selectedIndexPath != null)
  {
    var cell = MyCollectionView.CellForItem(selectedIndexPath) as CustomViewCell;
    cell?.SetToNormalState();
  }
  MyCollectionView.EndInteractiveMovement();
}
4

2 回答 2

1

您应该将手势的位置与ContentViewnot Framelike 进行比较:

case UIGestureRecognizerState.Changed:

    CGPoint gesturePoint = gesture.LocationInView(MyCollectionView);

    CGSize contentSize = MyCollectionView.ContentSize;

    if (gesturePoint.X > 0 && gesturePoint.X < contentSize.Width &&
        gesturePoint.Y > 0 && gesturePoint.Y < contentSize.Height)
    {
        MyCollectionView.UpdateInteractiveMovement(gesture.LocationInView(MyCollectionView));
    }
    break;

调整 if 语句中的常量以满足您的要求。

MoveItem()此外,当您调用时,可能会发生崩溃MyCollectionView.EndInteractiveMovement();。您可以尝试发布一些有关它的代码。

于 2018-02-26T09:33:44.860 回答
0

您可以使用

collectionView.bounces = false

如果你想拖到边缘。

您还可以发布您遇到的崩溃吗?

于 2018-02-23T15:28:49.163 回答