所以我看过很多关于重新排序与使用"编辑模式"有关的单元格的帖子,但没有解决我遇到的问题。 (对不起,如果我错了)。
我正在构建一个排名应用程序,并寻找一种方法来使用长手势识别器来重新排序我的UITableView中的单元格。基本上用户将能够重新排序并且排名"排名"与他们的朋友在一组中充满串的细胞。
我会选择使用"编辑"导航栏中的栏按钮项,但我使用导航栏的右上角已经为表视图添加新的字符串。 (下图描绘了我的意思)。
到目前为止,我添加了`
var lpgr = UILongPressGestureRecognizer(target: self, action: "longPressDetected:")
lpgr.minimumPressDuration = 1.0;
tableView.addGestureRecognizer(lpgr)`
到我的viewDidLoad方法,并开始创建以下函数:
func longPressDetected(sender: AnyObject) {
var longPress:UILongPressGestureRecognizer = sender as UILongPressGestureRecognizer
var state:UIGestureRecognizerState = longPress.state
let location:CGPoint = longPress.locationInView(self.tableView) as CGPoint
var indexPath = self.tableView.indexPathForRowAtPoint(location)?
var snapshot:UIView!
var sourceIndexPath:NSIndexPath!
}
我在互联网上所提供的所有资源最终都显示了一个巨大的,长期的功能添加剂列表,以便获得所需的结果,但这些示例涉及核心数据。在我看来,必须有一个更容易的方法来简单地重新排序tableview单元格长按?
答案 0 :(得分:18)
WayPointCell
是您的CustomUITableViewCell
,wayPoints
是UITableView的dataSource数组
首先,把它放在你的viewDidLoad中,就像Alfi提到的那样:
override func viewDidLoad() {
super.viewDidLoad()
let longpress = UILongPressGestureRecognizer(target: self, action: #selector(longPressGestureRecognized(gestureRecognizer:)))
self.tableView.addGestureRecognizer(longpress)
}
然后实施方法:
func longPressGestureRecognized(gestureRecognizer: UIGestureRecognizer) {
let longpress = gestureRecognizer as! UILongPressGestureRecognizer
let state = longpress.state
let locationInView = longpress.location(in: self.tableView)
var indexPath = self.tableView.indexPathForRow(at: locationInView)
switch state {
case .began:
if indexPath != nil {
Path.initialIndexPath = indexPath
let cell = self.tableView.cellForRow(at: indexPath!) as! WayPointCell
My.cellSnapShot = snapshopOfCell(inputView: cell)
var center = cell.center
My.cellSnapShot?.center = center
My.cellSnapShot?.alpha = 0.0
self.tableView.addSubview(My.cellSnapShot!)
UIView.animate(withDuration: 0.25, animations: {
center.y = locationInView.y
My.cellSnapShot?.center = center
My.cellSnapShot?.transform = CGAffineTransform(scaleX: 1.05, y: 1.05)
My.cellSnapShot?.alpha = 0.98
cell.alpha = 0.0
}, completion: { (finished) -> Void in
if finished {
cell.isHidden = true
}
})
}
case .changed:
var center = My.cellSnapShot?.center
center?.y = locationInView.y
My.cellSnapShot?.center = center!
if ((indexPath != nil) && (indexPath != Path.initialIndexPath)) {
self.wayPoints.swapAt((indexPath?.row)!, (Path.initialIndexPath?.row)!)
//swap(&self.wayPoints[(indexPath?.row)!], &self.wayPoints[(Path.initialIndexPath?.row)!])
self.tableView.moveRow(at: Path.initialIndexPath!, to: indexPath!)
Path.initialIndexPath = indexPath
}
default:
let cell = self.tableView.cellForRow(at: Path.initialIndexPath!) as! WayPointCell
cell.isHidden = false
cell.alpha = 0.0
UIView.animate(withDuration: 0.25, animations: {
My.cellSnapShot?.center = cell.center
My.cellSnapShot?.transform = .identity
My.cellSnapShot?.alpha = 0.0
cell.alpha = 1.0
}, completion: { (finished) -> Void in
if finished {
Path.initialIndexPath = nil
My.cellSnapShot?.removeFromSuperview()
My.cellSnapShot = nil
}
})
}
}
func snapshopOfCell(inputView: UIView) -> UIView {
UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, false, 0.0)
inputView.layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
let cellSnapshot : UIView = UIImageView(image: image)
cellSnapshot.layer.masksToBounds = false
cellSnapshot.layer.cornerRadius = 0.0
cellSnapshot.layer.shadowOffset = CGSize(width: -5.0, height: 0.0)
cellSnapshot.layer.shadowRadius = 5.0
cellSnapshot.layer.shadowOpacity = 0.4
return cellSnapshot
}
struct My {
static var cellSnapShot: UIView? = nil
}
struct Path {
static var initialIndexPath: IndexPath? = nil
}
答案 1 :(得分:8)
给这个教程一个镜头,你可能会在20分钟内启动并运行:
Great Swift Drag & Drop tutorial
很容易。我只开发了3个月而且我能够实现这一点。我也尝试了其他几个,这是我能理解的。
它是用Swift编写的,它实际上是剪切和粘贴的。将longPress代码添加到viewDidLoad,然后将该函数粘贴到类的“body”中。本教程将指导您,但没有更多内容。
代码的快速解释:此方法使用switch语句来检测longPress是刚开始,更改还是默认。每种情况都运行不同的代码。它会拍摄长按单元格的快照/图片,隐藏单元格并移动快照。完成后,它将取消隐藏您的单元格并从视图中删除快照。
警告:我的一个警告是,尽管这种拖放看起来很棒并且接近完美,但似乎确实存在一个问题,即在拖动最低/最低的单元格时它会崩溃底部细胞。
答案 2 :(得分:0)
从iOS 11开始,这可以通过实现内置的UITableView拖放委托来实现。
在类似问题的答案中,您将找到有关如何实现它们的详细说明: https://stackoverflow.com/a/57225766/10060753