2016-05-25 14 views
2

水平スクロールでUICollectionViewを取得しました。各セルは、配列内のオブジェクト(通貨コード)に対応しています。私が望むのは、ドラッグアンドドロップジェスチャーでセルを並べ替えることができることです。UICollectionViewセルの水平方向の並び替え

UITableViewでtutorialが見つかりましたが、試してみましたが、セルを保持してドラッグすると、画面の端に指を動かすと垂直方向にしか移動せず、スクロールしません。ここにはgifがあります。

私は、セルが垂直にではなく水平に移動し、画面の端に達するとコレクションビューがスクロールするようにしたいとします。どうすればこれを達成できますか?

は、これは私が今持っているものです。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(longPressGestureRecognised:)]; 
[self.collectionView addGestureRecognizer: longPress]; 


-(IBAction) longPressGestureRecognised:(id)sender 
{ 
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender; 
UIGestureRecognizerState state = longPress.state; 

CGPoint location = [longPress locationInView: self.collectionView]; 
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint: location]; 

static UIView *snapshot = nil; 
static NSIndexPath *sourceIndexPath = nil; 

switch (state) { 
    case UIGestureRecognizerStateBegan: { 
     if (indexPath) { 
      sourceIndexPath = indexPath; 

      UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath: indexPath]; 

      // Take a snapshot of the selected item using helper method. 
      snapshot = [self customSnapshotFromView: cell]; 

      // Add the snapshot as subview, centered at cell's centre. 
      __block CGPoint centre = cell.center; 
      snapshot.center = centre; 
      snapshot.alpha = 0.0; 
      [self.collectionView addSubview: snapshot]; 
      [UIView animateWithDuration: 0.25 animations:^{ 

       // Offset for gesture location. 
       centre.y = location.y; 
       snapshot.center = centre; 
       snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05); 
       snapshot.alpha = 0.98; 

       // Fade out. 
       cell.alpha = 0.0; 

      } completion: ^(BOOL finished) { 
       cell.hidden = YES; 
      }]; 
     } 
     break; 
    } 

    case UIGestureRecognizerStateChanged: { 
     CGPoint centre = snapshot.center; 
     centre.y = location.y; 
     snapshot.center = centre; 

     // Is destination valid and is it different from source? 
     if (indexPath && ![indexPath isEqual: sourceIndexPath]) { 
      // Update data source. 
      [currencyArray exchangeObjectAtIndex: indexPath.item withObjectAtIndex:sourceIndexPath.item]; 

      // Move the items. 
      [self.collectionView moveItemAtIndexPath: sourceIndexPath toIndexPath: indexPath]; 

      // And update source so it is in sync with UI changes. 
      sourceIndexPath = indexPath; 
     } 
     break; 
    } 

    default: { 
     // Clean up. 
     UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath: sourceIndexPath]; 
     cell.hidden = NO; 
     cell.alpha = 0.0; 
     [UIView animateWithDuration: 0.25 animations: ^{ 

      snapshot.center = cell.center; 
      snapshot.transform = CGAffineTransformIdentity; 
      snapshot.alpha = 0.0; 

      // Undo fade out. 
      cell.alpha = 1.0; 

     }completion: ^(BOOL finished) { 

      sourceIndexPath = nil; 
      [snapshot removeFromSuperview]; 
      snapshot = nil; 

     }]; 
     break; 
    } 
} 
} 


-(UIView *) customSnapshotFromView:(UIView *)inputView 
{ 
// Make an image from the input view. 
UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, NO, 0); 
[inputView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Create an image view. 
UIView *snapshot = [[UIImageView alloc] initWithImage: image]; 
snapshot.layer.masksToBounds = NO; 
snapshot.layer.cornerRadius = 0.0; 
snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0); 
snapshot.layer.shadowRadius = 5.0; 
snapshot.layer.shadowOpacity = 0.4; 

return snapshot; 
} 

編集:私はそれを考え出した 。 UIGestureRecognizerStateChangedで

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(handleLongGesture:)]; 
[self.collectionView addGestureRecognizer: longPress]; 

-(IBAction) handleLongGesture: (id)sender { 
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender; 

CGPoint location = [longPress locationInView: self.collectionView]; 
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint: location]; 

switch (longPress.state) { 
    case UIGestureRecognizerStateBegan: 
     [self.collectionView beginInteractiveMovementForItemAtIndexPath: indexPath]; 
     NSLog(@"Gesture began"); 
     break; 

    case UIGestureRecognizerStateChanged: 
     [self.collectionView updateInteractiveMovementTargetPosition: [longPress locationInView: longPress.view]]; 
     NSLog(@"Gesture state changed"); 
     break; 

    case UIGestureRecognizerStateEnded: 
     [self.collectionView endInteractiveMovement]; 
     NSLog(@"Gesture state ended"); 
     break; 

    default: 
     [self.collectionView cancelInteractiveMovement]; 
     NSLog(@"Gesture cancelled"); 
     break; 
    } 
} 

答えて

2

:ここでコードされ 変化のコード行

 CGPoint centre = snapshot.center; 
     centre.x = location.x; 
     snapshot.center = centre; 

centre.yは、

ドラッグX軸のcentre.xする

変化をドラッグy軸を返します

+0

ありがとうございましたが、私はすでにそれを試していました。私はUICollectionViewのinteractiveMovementメソッドを使用して終了しました。 – kangas08

関連する問題