我有一个问题,主要由this question回答。
但是,我的任务略有不同。我想将UIImageViews从UIPopover控制器拖放到另一个UIView,但是popover中包含的图像视图数量超过了iPad的高度,这意味着用户还必须能够滚动popover的内容(在UITableView中显示)。
我正在使用UIPanGestureRecognizer来检测拖放的尝试,但这实际上是通过拦截事件来禁用滚动。我想我知道如何处理这个问题。滚动本质上是一个垂直移动,而拖放则更像是一个横向移动。所以,我想当我检测到拖放的开始时,我必须检测它是否主要是垂直移动。如果是这样,我必须以某种方式触发滚动并将动作传递给那个“处理程序”。
任何a)关于这是否是正确的方法的反馈,以及b)关于实现的任何指针?
答案 0 :(得分:3)
我成功完成了这项工作,并希望分享解决方案。
因为我们正在处理UIPopoverController中的UITableView,所以你要处理的第一个问题是用户可能只想滚动tableview,而不是拖动其中一个单元格的内容(在这种情况下)一个UIImageView)。我通过将自定义手势识别器附加到我的自定义图像视图类来解决这个问题,这意味着加载到表视图中的每个图像视图都附加了一个自定义手势识别器。
手势识别器的关键是touchesMoved方法中的以下代码:
if (ABS(currentTouchLocation.y-self.firstTouchLocation.y) > 4 && ABS(currentTouchLocation.x-self.firstTouchLocation.x)< 2)
{
self.state = UIGestureRecognizerStateFailed;
}
导致手势识别器失败,允许触摸事件正常进入表格视图。使用&gt; 4和&lt; 2个条件控制将动作视为垂直滚动而不是拖放的角度。
其余的代码都在手势的动作方法中。在这里,您要做的第一件事就是创建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增量来实现拖动。相反,我只是将原始图像视图保留在原来的位置,并将delta应用于我的副本。
如果您遵循这种方法,您可以轻松地从UITableView / UIPopOverController在屏幕上的任何位置拖动UIImageView的副本。