2017-10-29 2 views
-1

3つのセルが3 x 3グリッドのコレクションビューがあります。私はこの質問への回答コードを使用してセルを交換することができます - Custom Cell Reorder Behavior in CollectionViewと私はまた、セルを使用して回転させることができますコレクションビューでセルを交換するときにセルの回転を維持する

if indexPath = self.collectionView?.indexPathForItem(at:sender.location self.collectionView)){

let cell = self.collectionView?.cellForItem(at: indexPath) 

cell?.transform = (cell?.transform.rotated(by: _direction))! 

}

問題は、私は、セルを回転させ、他の細胞とそれを交換するときに来ます。回転のリセットとセルは、スワップ後元の位置(0度)に戻ります。

私はセルを回転させ、回転を失うことなくそれらを入れ替えることができるようにしたいと思います。

EDIT: ここでセルを交換するための私のビューコントローラで回転機能だけでなく、handleLongGesture機能です:次に以下

@IBAction func userSwippedRight(_ sender: UISwipeGestureRecognizer) { 
    rotate(_direction: CGFloat(Double.pi/2), sender: sender) 
} 

@IBAction func userSwippedLeft(_ sender: UISwipeGestureRecognizer) { 
    rotate(_direction: CGFloat(-Double.pi/2), sender: sender) 
} 

func rotate(_direction: CGFloat, sender: UISwipeGestureRecognizer) { 

UIView.animate(withDuration: 0.25) { 
     if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 

      let cell = self.collectionView?.cellForItem(at: indexPath) 

      cell?.transform = (cell?.transform.rotated(by: _direction))! 


      let radians:Float = atan2f(Float(cell!.transform.b), Float(cell!.transform.a)) 
      var degrees:Int = Int(radians * Float(180/Double.pi)) 

      if(degrees == -180) 
      { 
       degrees = 180 
      } 

      print(degrees) 

     } else { 
      print("Swipe Registered") 

     } 
    } 
} 


func handleLongGesture(_ gesture: UILongPressGestureRecognizer) { 

    switch(gesture.state) { 

    case UIGestureRecognizerState.began: 
     guard let selectedIndexPath = self.collectionView?.indexPathForItem(at: gesture.location(in: self.collectionView)) else { 
      break 
     } 
     collectionView?.beginInteractiveMovementForItem(at: selectedIndexPath) 
    case UIGestureRecognizerState.changed: 
     collectionView?.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!)) 
    case UIGestureRecognizerState.ended: 
     collectionView?.endInteractiveMovement() 
    default: 
     collectionView?.cancelInteractiveMovement() 
    } 
} 

は私がのインタラクティブな動きのためのカスタム処理を追加したUICollectionViewのサブクラスであります細胞。

import UIKit 

    extension UIView { 
     func snapshot() -> UIImage { 
      UIGraphicsBeginImageContext(self.bounds.size) 
      self.layer.render(in: UIGraphicsGetCurrentContext()!) 
      let image = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 
      return image! 
     } 
    } 

    extension CGPoint { 
     func distanceToPoint(p:CGPoint) -> CGFloat { 
      return sqrt(pow((p.x - x), 2) + pow((p.y - y), 2)) 
     } 
    } 

    struct SwapDescription : Hashable { 
     var firstItem : Int 
     var secondItem : Int 

     var hashValue: Int { 
      get { 
       return (firstItem * 10) + secondItem 
      } 
     } 
    } 

    func ==(lhs: SwapDescription, rhs: SwapDescription) -> Bool { 
     return lhs.firstItem == rhs.firstItem && lhs.secondItem == rhs.secondItem 
    } 

    class SwappingCollectionView: UICollectionView { 

     var interactiveCell = UICollectionViewCell() 
     var myView : UICollectionView? 
     var interactiveIndexPath : NSIndexPath? 
     var interactiveView : UIView? 
     var swapSet : Set<SwapDescription> = Set() 
     var previousPoint : CGPoint? 

     static let distanceDelta:CGFloat = 2 // adjust as needed 


     override func beginInteractiveMovementForItem(at indexPath: IndexPath) -> Bool { 

      self.interactiveIndexPath = indexPath as NSIndexPath? 

      self.interactiveCell = self.cellForItem(at: indexPath as IndexPath) as! CustomCellCollectionViewCell 

      self.interactiveCell.transform = CGAffineTransform(scaleX: 1.05, y: 1.05) 

      self.interactiveView = UIImageView(image: self.interactiveCell.snapshot()) 

      self.interactiveView?.frame = self.interactiveCell.frame 

      self.addSubview(self.interactiveView!) 
      self.bringSubview(toFront: self.interactiveView!) 

      self.interactiveCell.isHidden = true 

      self.interactiveCell.transform = CGAffineTransform.identity 

      return true 
     } 


     override func updateInteractiveMovementTargetPosition(_ targetPosition: CGPoint) { 

      if (self.shouldSwap(newPoint: targetPosition)) { 

       if let hoverIndexPath = self.indexPathForItem(at: targetPosition), let interactiveIndexPath = self.interactiveIndexPath { 

        let swapDescription = SwapDescription(firstItem: interactiveIndexPath.item, secondItem: hoverIndexPath.item) 

        if (!self.swapSet.contains(swapDescription)) { 

         self.swapSet.insert(swapDescription) 

         self.performBatchUpdates({ 
          self.moveItem(at: interactiveIndexPath as IndexPath, to: hoverIndexPath) 
          self.moveItem(at: hoverIndexPath, to: interactiveIndexPath as IndexPath) 
         }, completion: {(finished) in 
          self.swapSet.remove(swapDescription) 

          self.dataSource?.collectionView!(self, moveItemAt: interactiveIndexPath as IndexPath, to: hoverIndexPath as IndexPath) 

          self.interactiveIndexPath = hoverIndexPath as NSIndexPath? 
         }) 
        } 
       } 
      } 

      self.interactiveView?.center = targetPosition 
      self.previousPoint = targetPosition 
     } 

     override func endInteractiveMovement() { 
      // Save the last rotation 
      self.cleanup() 
     } 

     override func cancelInteractiveMovement() { 
      self.cleanup() 
     } 

     func cleanup() { 

      self.interactiveCell.isHidden = false 
      self.interactiveView?.removeFromSuperview() 
      self.interactiveView = nil 
      self.interactiveCell.transform = CGAffineTransform.identity 
      self.interactiveIndexPath = nil 
      self.previousPoint = nil 
      self.swapSet.removeAll() 
     } 

     func shouldSwap(newPoint: CGPoint) -> Bool { 
      if let previousPoint = self.previousPoint { 
       let distance = previousPoint.distanceToPoint(p: newPoint) 
       return distance < SwappingCollectionView.distanceDelta 
      } 

      return false 
     } 

    } 

マイcollectionViewCellサブクラス

import UIKit 
import Firebase 
import FirebaseDatabase 

class CustomCollectionViewCell: UICollectionViewCell { 

    @IBOutlet weak var imageView: UIImageView! 


} 

答えて

0

あなたはどこかに回転状態を保存し、cellForItem(at:)でそれを適用する必要があります。さらに役立つように、私はあなたのビューコントローラからより多くのコードが必要です。

+0

私は上記のコードを追加しました。お役に立てれば?ありがとうございました。 – LizzyM

+0

私のコードは十分ですか?@cldrr – LizzyM

0

セルのトランスフォームを操作しないことをお勧めします。 UICollectionViewCellのカスタムサブクラスを設定し、すべてのコンテンツをコンテンツビュー内に置き、それを回転します。

また、各カスタムセルにcurrentRotationプロパティを与え、変換の回転と同期させておくこともできます。セルをフェッチするとき、またはセルをデキューするときは、currentRotationプロパティをチェックし、それを使って回転させる必要があるかどうかを確認します。

+0

私はかなり新しいです。あなたはこれをするのを助けるいくつかのコードを私に提供してもらえますか? – LizzyM

+0

私はそのようなコードが横たわっていないし、それを書く時間がありません。私の提案をステップに分けて、一度に1つずつ取り組んでください。あなたが立ち往生した場合は質問を投稿してください。 –

関連する問題