我有一个主要由this question回答的问题。
然而,我对这项任务有一个细微的变化。我想将UIImageViews从一个UIPopover控制器拖放到另一个UIView上,但是popover中包含的图像视图数量超过了iPad的高度,这意味着用户还必须能够滚动popover的内容(以UITableView的形式呈现)。
我使用UIPanGestureRecognizer来检测拖放的尝试,但这实际上是通过截获事件来禁用滚动。我想我知道怎么处理这件事。滚动本质上是垂直移动,而拖放更多的是横向移动。所以,我在想,当我检测到拖放的开始时,我必须检测它是否主要是垂直移动。如果是这样,我必须以某种方式触发滚动,并将运动传递给那个“处理程序”。
任何a)关于这是否是正确方法的反馈,以及b)关于实现的任何建议?
发布于 2011-07-01 06:11:16
我成功地完成了这项工作,并愿意与您分享解决方案。
因为我们处理的是UIPopoverController中的UITableView,所以您必须处理的第一个问题是,用户可能只想滚动表视图,而不是拖动其中一个单元格(在本例中是UIImageView)的内容。我通过将一个自定义手势识别器附加到我的自定义图像视图类来解决这个问题,这意味着加载到表视图中的每个图像视图都附加了一个自定义手势识别器。
手势识别器的关键是touchesMoved方法中的以下代码:
if (ABS(currentTouchLocation.y-self.firstTouchLocation.y) > 4 && ABS(currentTouchLocation.x-self.firstTouchLocation.x)< 2)
{
self.state = UIGestureRecognizerStateFailed;
}导致手势识别器失败允许触摸事件照常前进到表视图。>4和<2条件的使用控制一个动作被认为是垂直滚动而不是拖放的角度。
其余的代码放在手势的action方法中。在这里,您要做的第一件事是创建tableview单元格的图像视图的副本,并将其添加到主窗口中:
self.newImageView = [[ElementImageView alloc] initWithImage:self.image];
self.newImageView.frame = [self.superview convertRect:self.frame toView:[UIApplication sharedApplication].keyWindow];
[[UIApplication sharedApplication].keyWindow addSubview:self.newImageView];正是在这一点上,我最挣扎。我一直在试图找到一种方法来将触摸转移到这个新的图像视图,或者以某种方式以编程方式触发触摸,这样我的拖动动作就可以无缝地进行。这是完全不必要的。拖动是通过将关联触摸的第一个位置与最新位置之间的x/y增量应用于视图来实现的。相反,我只是将我的原始图像视图留在原来的位置,并将增量应用到我的副本中。
如果您遵循此方法,则可以轻松地将UIImageView的副本从屏幕上的UITableView/UIPopOverController拖动到任何位置。
https://stackoverflow.com/questions/6479347
复制相似问题