如何在iOS 11中检测UIWebview掉落?

7

我有一个 UIWebView。我正在尝试实现 iOS11 的拖放功能。当我从Safari中拖动项目并将其放在我的 UIWebView 中时,我想知道哪个委托方法会被调用。有什么建议吗?


我认为,在移动设备上——1. Safari 可能不允许拖拽操作——2. 拖拽操作不能将两个应用程序相互切换。如果您在移动设备的 Web 浏览器中看过此操作,请分享任何参考资料。 - Krunal
我正在尝试在iPad Pro上进行@Krunal的编程。 - Sheik_101
2个回答

3

UIWebview的大部分功能都是在一个名为UIWebBrowserView的未记录类中实现的。该视图设置了其“交互”属性,并将这些交互的委托设置为同一UIWebBrowserView。

根据您的需求,有三个选项来检测拖放:

1)您可以在Web视图的内容中使用JavaScript来检测拖放。代码如下:

document.addEventListener('drop', function() {
     // Drop detected
} ) ;

2)您可以在UIWebBrowserView中禁用拖放交互。这样他们就可以传播到其中一个包含视图中,您可以在那里添加自己的交互。具体操作如下:

webView.scrollView.subviews[0].interactions = @[] ;  

完成上述操作后,你可以创建自己的交互,并将它们添加到容器视图中:

 UIDropInteraction *dropInteration = [[UIDropInteraction alloc]initWithDelegate:myController] ;
 [webView addInteraction:dropInteration] ;
 webView.userInteractionEnabled = YES ;

您需要在'myController'中实现UIDropInteractionDelegate功能。

3) 您可以交叉编译UIWebBrowserView并将UIDropInteractionDelegate方法替换为自己的方法。


我认为2和3不会起作用。我正在尝试第一个选项。如何在js中获取被删除的文本或图像? - Sheik_101
1
实际上,我能够让'2'和'3'都正常工作,但是我无法让'1'正常工作,因为我遇到了与你相同的障碍。我无法确定被放置的对象。我的javascript技能有限,但我确信可以使用javascript获取有关已放置对象的信息。我只是不知道如何做。就我而言,我选择了'2',因为它只需要一行代码来禁用拖放的默认行为。我甚至能够通过检查现有交互的类并仅删除dropInteraction来保留默认的拖动交互。 - Rich Waters
是的,我正在尝试您建议的第二个选项。我在执行拖放操作时也获取到了数据。当我在UIWebView上拖动时,是否可以移动光标?您做过吗?另外,您如何使落下的内容产生动画效果? - Sheik_101
是的。光标是一个问题。混合方法('3')可以为您处理这个问题,但是您也可以使用 '2' 来自己处理它。在 sessionDidUpdate 中,我创建了一个单独的视图来模拟光标,并将该视图的原点设置为基于 [session locationInView:self] 的某个值。从委托返回的 'dropProposal' 应该设置 '.precise' 为 YES。当调用 performDrop 时,我使用 JavaScript 将真实的光标设置为基于自定义伪光标视图位置的范围。我还没有对内容放置进行动画处理,所以无法回答这个问题。 - Rich Waters
非常感谢。您能告诉我如何在这里进行方法交换(选项3)吗?您可以发布一些代码吗? - Sheik_101

2

这是针对普通的UIView拖放操作。 - Sheik_101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接