【问题标题】:UIPopoverController Drag and DropUIPopoverController 拖放
【发布时间】:2011-06-25 17:21:47
【问题描述】:

我有一个问题,this question 主要回答了这个问题。

但是,我的任务略有不同。我想将 UIImageViews 从 UIPopover 控制器拖放到另一个 UIView,但弹出框中包含的图像视图数量超过了 iPad 的高度,这意味着用户还必须能够滚动弹出框的内容(显示在 UITableView 中)。

我正在使用 UIPanGestureRecognizer 来检测拖放的尝试,但这实际上通过拦截事件来禁用滚动。我想我知道如何处理这个问题。滚动本质上是一种垂直移动,而拖放更像是一种横向移动。所以,我在想,当我检测到拖放的开始时,我必须检测它是否主要是垂直移动。如果是这样,我必须以某种方式触发滚动并将动作传递给那个“处理程序”。

任何 a)关于这是否是正确的方法的反馈,以及 b)关于实施的任何指针?

【问题讨论】:

  • 我实现了从表格视图拖动,这是相同的情况,我从中抽象出一个拖放协议,所以我最终实现了我自己的 DragGestureRecognizer,不确定是否有必要,但我记得我添加的第一个手势识别器不起作用
  • @bshirley...您能详细说明一下您自己的 DragGestureRecognizer 的实现吗?

标签: ios drag-and-drop uipopovercontroller


【解决方案1】:

我已成功完成此操作,并希望分享解决方案。

因为我们正在处理 UIPopoverController 中的 UITableView,所以您必须处理的第一个问题是用户可能只想滚动 tableview,而不是拖动其中一个单元格的内容(在这种情况下一个 UIImageView)。我通过将自定义手势识别器附加到自定义图像视图类来解决此问题,这意味着加载到表格视图中的每个图像视图都附加了一个自定义手势识别器。

手势识别器的关键在于 touchesMoved 方法中的以下代码:

if (ABS(currentTouchLocation.y-self.firstTouchLocation.y) > 4 && ABS(currentTouchLocation.x-self.firstTouchLocation.x)< 2)
{

    self.state = UIGestureRecognizerStateFailed;

}

导致手势识别器失败允许触摸事件像往常一样继续到表格视图。使用 > 4 和

其余代码位于手势的操作方法中。在这里,您要做的第一件事就是创建 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 拖动到屏幕上的任何位置。

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多