拖放简介

今年,我有一个绝佳的机会参加了在加利福尼亚州圣何塞举行的Apple开发者大会。 拖放,Core ML,AR Kit是Apple发布的一些API和框架。 在这些新的API和框架中,我更着迷于在单个应用程序或单独的应用程序中将内容从一个地方拖放到另一个地方的功能。

总览

拖放利用Multi-Touch的强大功能,使您可以在iPad上以自然的方式在应用程序之间移动内容。 您只需按住图像,文件或选定的文本并将其拖到他们想要的位置即可。 阅读完Apple的拖放文档后,我将构建一个应用程序,该应用程序仅允许您从浏览器或具有拖动功能的另一个应用程序中拖动图像并将其拖放到视图中。

入门

首先,打开Xcode 9 https://developer.apple.com/download/并创建一个新项目。

选择单视图应用程序,然后将Swift作为您的语言。 更改您的组织名称和标识符。

添加UIDropInteractionDelegate协议

打开ViewController.Swift并扩展UIDropInteractionDelegate协议。 在viewDidLoad()内部添加

self.view.addInteraction(UIDropInteraction(委托:self)。

UIDropInteraction允许用户将项目放置到视图上,并使用委托实例化对象并响应来自放置会话的调用。

在viewDidLoad()下面实现UIDropInteractionDelegate协议,添加canHandle会话方法

func dropInteraction(_交互:UIDropInteraction,canHandle

会话:UIDropSession)->布尔{

返回session.canLoadObjects(ofClass:UIImage.self)

}

当放置会话的触摸超过潜在的目标视图时,将调用canHandle会话方法,这是您的应用程序有机会告诉系统是否要使用拖动项。

在canHandle会话方法下面添加sessionDidUpdate方法

func dropInteraction(_交互:UIDropInteraction,

sessionDidUpdate会话:UIDropSession)-> UIDropProposal {

返回UIDropProposal(操作:.copy)

}

当放置会话以下列任何一种方式更改时,将调用此委托方法:其可视表示的接触点已进入放置交互的视图,或已在视图中移动,或在控件内部时将拖动项添加到会话中。要使视图有资格接受放置会话中的数据,必须实现此方法。

func dropInteraction(_交互:UIDropInteraction,performDrop

会话:UIDropSession){

用于session.items {

item.itemProvider.loadObject(ofClass:UIImage.self,

completeHandler:{{obj,err)在

如果让err = err {

打印(“ Errror”,err)

}

守卫让draggedItem = obj作为? UIImage其他

{返回}

DispatchQueue.main.async {

让imageView = UIImageView(image:draggedItem)

self.view.addSubview(imageView)

让centerPoint = session.location(in:

自我看法)

imageView.center = centerPoint

}

})

}

}

performDrop是一种工具,用于请求和使用放置会话的项目提供程序中的数据。

测试中

现在,我们可以将Safari或您的照片应用程序作为Slider-over打开并搜索图像。 现在,只需按住任意图像,然后拖动到DragDropDemo应用即可。

结论

您可以从我的Github存储库https://github.com/gee-whiz/DragTwo下载完整的源代码

参考: https : //developer.apple.com/ios/drag-and-drop/