教程如何从UITableView拖放项目到UITableView

我一直在这个问题上磕头,我想了一下。 我想回到社区,因为我从这个网站得到了很多帮助:)。

我试图从一个UITableView项目复制到另一个UITableView和我在网上看到有关如何做到这一点的信息已经粗略充其量。 我自己想清楚了,所以我会描述一下我的小build筑。

  • 掌握UIView
    • UIView与UITableView
      • 自定义UITableViewCell
        • 被复制的自定义UIView(在我的情况下是Person对象)
    • UIView与UITableView
      • 自定义UITableViewCell
        • 被复制的自定义UIView(在我的情况下是Person对象)

我在UITableView中拥有的对象是我想从一个表中拖放到另一个表中的对象。 我最困难的是弄清楚如何将物品从表中popup,然后用一个平滑的动作拖动它。 时间最长,为了执行操作,我需要两个触摸。

从Person对象开始,这是一个包含图像的简单对象。 当发生拖动时,我必须实现自己的touchesMoved方法来改变Person的中心位置。

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if( m_moveable == YES ){ UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:self.superview]; if( 0 < location.x-50 && location.x+50 < 768 ){ if( 0 < location.y-50 && location.y+150 < 1004 ){ self.center = location; } } } } 

我在初始化时将Person对象的userInteractionEnabled标志设置为NO,以便表中的任何点击都不会被Person对象捕获。 在这种情况下,Person对象会在表格中移动,从而破坏目的。

下一个对象是我自定义的UITableViewCell。 该对象负责捕捉用户的第一次触摸。 它应该做的是赶上这个触摸,并“出”人。 Person是属于自定义UITableViewCell的子视图之一。

  - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UIView *parent = self.superview.superview.superview; Person *s = nil; for( UIView *child in self.subviews ){ if( [child isKindOfClass:[Person class]] ){ s = child; s removeFromSuperview]; break; } } if( s != nil ){ self.userInteractionEnabled = NO; s.userInteractionEnabled = YES; UITableView *subParent = self.superview; //EDIT #1 subParent.scrollEnabled = NO; //EDIT #1 [parent addSubview:s]; //[self touchesEnded:touches withEvent:event]; //EDIT #1 } } 

注意到在上面的方法中翻转userInteractionEnabled标志是很重要的。 在触摸之前,Person对象对于一个人的触摸是“不受限制的”。 在自定义单元格捕获移动之后,通过将Person添加到父视图然后激活(userInteractionEnabled = YES)来释放Person。 Person对象然后是“天生的”,并可以处理它自己的移动触摸。

这有一个小故障,即Person对象在左上angular闪烁,然后立即下降到用户的手指。

这个devise的最后一部分是主UIView需要处理一个“触摸转换”。 当用户触摸表并且Person对象被popup时,应用程序需要意识到焦点需要从表中移除并指向Person对象。 这样做的方式是在主UIView中的hitTest方法被重载以下。

 - (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *rv = nil; for(UIView *child in self.subviews){ if( [child isKindOfClass:[Person class]] ){ rv = child; child.center = point; break; } } if( rv == nil ){ rv = [super hitTest:point withEvent:event]; } return rv; } 

这个代码的工作方式是,当Person从表中popup时,它没有关注它的触摸。 该触摸是由UITableView“Person”所拥有,Person从中被popup。 hitTest方法是重新调整该触摸的关键。 定期地,系统检查哪个UIView是触摸的焦点。 系统调用hitTest方法来识别UIView。 当Person被附加到主视图时,这个hitTest函数遍历所有子视图,并检测Person的存在,并将其作为“主导”触摸对象返回。 手指的任何移动都会立即被报告给Person而不是UITableView。

这是实施的胆量。 有一个UITableView“捕捉”移动的对象现在很简单,我会离开它为您尝试! 如果您有任何问题,请发帖!

编辑#1删除Person对象比我想象的更难:)。 我不得不添加一行来阻止UITableView滚动,因为UITableView在所有的移动事件中都是吸吮的。
touchesEnded函数在自定义的UITableViewCell类中触发。
MJ

您好我已经设法创build一个UITableView中的行拖放到同一个表的另一行。 我创build了一个uiImageView代表移动的项目(这是从表中删除),并将其附加到最前面的UIView,使其在整个屏幕上拖动。 这里有一些关于我面临的痛苦的post:

  1. UITableView:拖到另一个行
  2. UITableView:以编程方式滚动内容视图
  3. UITableView:自定义手势使它不再滚动

希望这可以帮助^^

Interesting Posts