我在storyBoard中有一个tableView,我在其中添加了4个静态单元格,我的storyBoard看起来像:
我没有这个tableView的任何dataSource,因为我的单元格是静态的.
我使用下面的代码拖动一个单元格,它工作正常,直到我滚动一个表格.
import UIKit class TableViewController: UITableViewController { var sourceIndexPath: NSIndexPath = NSIndexPath() var snapshot: UIView = UIView() let longPress: UILongPressGestureRecognizer = { let recognizer = UILongPressGestureRecognizer() return recognizer }() override func viewDidLoad() { super.viewDidLoad() longPress.addTarget(self,action: "longPressGestureRecognized:") self.tableView.addGestureRecognizer(longPress) self.tableView.allowsSelection = false } override func viewWillAppear(animated: Bool) { self.tableView.reloadData() } // MARK: UIGestureRecognizer func longPressGestureRecognized(gesture: UILongPressGestureRecognizer){ let state: UIGestureRecognizerState = gesture.state let location:CGPoint = gesture.locationInView(self.tableView) if let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(location){ switch(state){ case UIGestureRecognizerState.Began: sourceIndexPath = indexPath let cell: UITableViewCell = self.tableView .cellForRowAtIndexPath(indexPath)! //take a snapshot of the selected row using helper method snapshot = customSnapshotFromView(cell) //add snapshot as subview,centered at cell's center var center: CGPoint = cell.center snapshot.center = center snapshot.alpha = 0.0 self.tableView.addSubview(snapshot) UIView.animateWithDuration(0.25,animations: { () -> Void in center.y = location.y self.snapshot.center = center self.snapshot.transform = CGAffineTransformMakeScale(1.05,1.05) self.snapshot.alpha = 0.98 cell.alpha = 0.0 },completion: { (finished) in cell.hidden = true }) case UIGestureRecognizerState.Changed: let cell: UITableViewCell = self.tableView.cellForRowAtIndexPath(indexPath)! var center: CGPoint = snapshot.center center.y = location.y snapshot.center = center print("location \(location.y)") //is destination valid and is it different form source? if indexPath != sourceIndexPath{ //update data source //I have commented this part because I am not using any dataSource. // self.customArray.exchangeObjectAtIndex(indexPath.row,withObjectAtIndex: sourceIndexPath.row) //move the row self.tableView.moveRowAtIndexPath(sourceIndexPath,toIndexPath: indexPath) //and update source so it is in sync with UI changes sourceIndexPath = indexPath } if (location.y < 68) || (location.y > 450) { print("cancelled") self.snapshot.alpha = 0.0 cell.hidden = false UIView.animateWithDuration(0.10,animations: { () -> Void in self.snapshot.center = cell.center self.snapshot.transform = CGAffineTransformIdentity self.snapshot.alpha = 0.0 //undo fade out cell.alpha = 1.0 },completion: { (finished) in self.snapshot.removeFromSuperview() }) } case UIGestureRecognizerState.Ended: //clean up print("ended") let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! cell.hidden = false UIView.animateWithDuration(0.25,animations: { () -> Void in self.snapshot.center = cell.center self.snapshot.transform = CGAffineTransformIdentity self.snapshot.alpha = 0.0 //undo fade out cell.alpha = 1.0 },completion: { (finished) in self.snapshot.removeFromSuperview() }) break default: break } }else{ gesture.cancelsTouchesInView = true } } func customSnapshotFromView(inputView: UIView) -> UIView { // Make an image from the input view. UIGraphicsBeginImageContextWithOptions(inputView.bounds.size,false,0) inputView.layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); // Create an image view. let snapshot = UIImageView(image: image) snapshot.layer.masksToBounds = false snapshot.layer.cornerRadius = 0.0 snapshot.layer.shadowOffset = CGSize(width: -5.0,height: 0.0) snapshot.layer.shadowRadius = 5.0 snapshot.layer.shadowOpacity = 0.4 return snapshot } }
拖动后滚动它看起来像:
正如你所看到的那样,细胞不再出现了.我想拖放静态单元格,我想保存它的位置,所以当我滚动时我不会再重新排列.
Sample项目了解更多信息.
这只是一个演示项目但我在我的单元格中添加了许多元素,每个单元格都有不同的UI.
解决方法
有一个库可以使用非常类似的方法完成您正在寻找的工作.它被称为
FMMoveTableView,但它适用于具有数据源的单元.
我认为造成问题的原因是,当您移动单元格然后从故事板滚动数据源时,不再与表格同步,因此无法重绘单元格对象.
我认为你应该这样实现你的表:
>制作4个单元格自定义单元格.>每个子类.>创建一个数字为1到4的数组>在长拖动时重新排序数组>覆盖cellForRowAtIndexPath以显示正确数字的正确单元格