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!
}
私は上記のコードを追加しました。お役に立てれば?ありがとうございました。 – LizzyM
私のコードは十分ですか?@cldrr – LizzyM