Ios UICollectionView-将UICollectionView外部的单元格拖动到特定UIView
我有一个Ios UICollectionView-将UICollectionView外部的单元格拖动到特定UIView,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我有一个UICollectionView,里面有很多UICollectionViewCells 搜索了很多,但找不到与此问题相关的任何内容 我的目标是将其中一个粉色方块(UICollectionViewCell)拖动到灰色视图(UIView)。 你可以把它想象成把你桌面上的文件夹拖到你的垃圾桶里,除了我不想删除粉红色的方块。或者从dock中拖动图标(它会弹回来) 当粉色区域碰到灰色区域时,它应该回到原来的位置,在其他任何地方使用某种简单的语句退出时也应该如此 有人能帮我解决问题,或者让我参考一些
UICollectionView
,里面有很多UICollectionViewCell
s
搜索了很多,但找不到与此问题相关的任何内容
我的目标是将其中一个粉色方块(UICollectionViewCell
)拖动到灰色视图(UIView
)。
你可以把它想象成把你桌面上的文件夹拖到你的垃圾桶里,除了我不想删除粉红色的方块。或者从dock中拖动图标(它会弹回来)
当粉色区域碰到灰色区域时,它应该回到原来的位置,在其他任何地方使用某种简单的语句退出时也应该如此
有人能帮我解决问题,或者让我参考一些参考资料或样本吗?
非常感谢,如果你想要更多的信息。让我知道
如果我能正确理解你的意思,我以前也做过类似的事情,我发现最好使用细胞的假图像,而不是细胞本身 例如,单元格2开始被拖动,您立即调用“SetHidden=YES”,并使用简单的绘制方法在完全相同的位置绘制一个假单元格:
UIGraphicsBeginImageContext(self.cell.bounds.size);
[self.cell.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
这个你可以随意移动,当它返回时,你也可以用同样的方法。
希望这对您有所帮助。这在swift 3中对我很有用:
class DragAndDropGestureManager: NSObject {
var originalPosition: CGPoint?
var draggedView: UIView?
var viewSize: CGSize?
var originalZIndex: CGFloat = 0
@objc func handleDrag(_ recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .began:
if let view = recognizer.view {
draggedView = view
originalPosition = view.frame.origin
viewSize = view.frame.size
originalZIndex = view.layer.zPosition
view.layer.zPosition = 1
}
case .changed:
if let view = recognizer.view {
let currentPosition = recognizer.location(in: view.superview!)
let newPosition = CGPoint(x: currentPosition.x - (viewSize!.width / 2.0), y: currentPosition.y - (viewSize!.height / 2.0))
view.frame.origin = newPosition
} else {
self.finishDrag()
}
case .ended:
finishDrag()
default:
print("drag default \(recognizer.state.rawValue)")
}
}
func finishDrag() {
self.draggedView?.frame.origin = originalPosition!
self.draggedView?.layer.zPosition = originalZIndex
originalZIndex = 0
originalPosition = nil
draggedView = nil
}
}
我在函数public func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell
像这样:
if self.dragManager != nil && cell.gestureRecognizers == nil {
cell.addGestureRecognizer(UIPanGestureRecognizer(target: dragManager!, action: #selector(DragAndDropGestureManager.handleDrag)))
}
if用于不多次添加gesutre识别,因为单元正在被重用
不要忘记添加
collectioView.clipToBounds=false
否则,当尝试移出集合视图的边界时,拖动的单元格将被剪裁好主意。也许这种方法会奏效。顺便说一句:对于iOS7,有一种新的UIView截图/快照方法,称为:-(UIView*)SnapshotViewAfterScreen更新:(BOOL)afterUpdates;你可以分享更具体的代码,这样我就可以使用你的代码。在你的回答中,我无法理解什么是dragManager!。我的要求与user023类似,但有一点变化:若我将粉色单元格拖到灰色单元格,粉色单元格将从collectionView中消失,灰色单元格将在第二个collectionView中。当粉红色变成灰色时,我需要执行一个动作。请帮助我,谢谢。self.dragManager是DragAndDropGestureManager的本地实例@user023想让他拖的牢房回到原来的地方,所以我就这么做了。如果要检测粉色单元格是否被拖动并释放到灰色正方形上,则需要将手势的位置从“.end”案例传递到视图控制器,并检查是否与灰色正方形相交。不要忘记将位置转换为相同的灰色正方形网格