使用Swift偷窥iOS 11拖放API

iOS 11带来了许多新的API。 这使我们能够使用户与应用程序的交互更加直观和愉快。 但是一个功能无疑引起了我的注意,它是不同应用程序之间的拖放。 我认为这是用户一次与多个应用交互的方式的改变者。

实现此功能似乎很困难,但我想向您保证并非如此。 今天,我们将构建一个简单的移动应用程序,允许用户将图像从任何应用程序拖动到我们的应用程序。


首先,您需要Xcode 9,可以从Apple官方网站下载。 如果您决定测试我们要在真实设备上构建的应用程序,请确保该应用程序可在iOS 11上运行。我们不会创建任何其他元素,我们将使用默认创建的ViewController类。

为了能够处理此拖放,我们将使用新UIDropInteractionDelegate方法。 您可以在应用程序中使用多种可选方法。 我们将仅需实现3种可选方法,这些方法将帮助我们组织和处理拖放过程:

另外,我们需要确保我们的类符合该新API协议。 我们必须告诉Xcode,我们的视图支持这种交互(图像的拖放)。 为此,只需添加UIDropInteraction并提及我们的ViewController类是此交互的委托:

与我们的视图添加新的交互之后,您的ViewController类应该具有以下内容:

好的,现在我们已经基本设置好一切,可以使我们的应用正常工作。 让我们从“拖放”会话中获取图片,并将其放在视图顶部。 我们将使用第一个委托方法来获取图片并处理Drag&Drop的结尾。 我将向您展示代码,然后将详细描述每个步骤:

现在让我们看看我们已经完成了什么:

  1. 放下之后,我们可以使用属性session.items访问我们的项目,该属性返回一个数组(因为可能会拖动多个项目)。 因此,我们遍历这些项目。
  2. 为了从拖动的项目中获取对象,我们调用itemProvider属性(这是一个仅获取属性),然后调用一个方法,该方法返回带有对象和错误的闭包。 注意:您还必须输入对象的类,在本例中为UIImage.self
  3. 然后,通过使用防护结构,我们检查错误是否为nil。 如果发生错误,我们将打印错误消息并退出此方法。
  4. 在此关闭中,我们收到了一个可选对象,因此我们必须检查它是否真的是UIImage类。 我们使用防护结构来做到这一点。
  5. 我们的方法dragItem.itemProvider.loadObject(…)做一些异步工作。 因此,如果我们想使用UI添加工作并将图像添加到视图中,则必须确保在主线程上进行操作。
  6. 最后,我们使用图像创建一个UIImageView ,并将此视图作为子视图添加到主视图中。 然后,将其框架设置为与图片的框架相同。 通过使用属性session.location(in: self.view)我们将UIImageView的中心放在手指上。

现在让我们检查一下结果:

我们实现了一项非常强大的新功能-拖放的基本功能。 作为开发人员,您不仅可以处理图像,还可以处理文本,链接等的拖放操作。在计算了用户将对象拖动到何处后,可以将其放在任何可视容器中: UITableViewCellUICollectionViewUIView等。Apple提供了很多种类的委托方法,使您可以轻松实现此功能。

您可以在此Github存储库中找到所有示例代码。 感谢您阅读🙂