简单使用 iOS 的 Drag and Drop

理解 Drag and Drop

概述

Drag and Drop 是 Apple 在 WWDC 2017 上提出的 iOS 11 的新特性,它可以让我们很方便的实现“拖拽”功能,例如拖拽文本、图片和其他物体,iOS 11 的内建 App 中已经全面的应用了这个特性,你可以把 Photos 中的照片拖拽到正在编辑的邮件中,得益于 Multi-Touch,我们在拖拽的过程中可以正常进行其他的操作,整个拖拽过程是在子线程中完成的,所以你可以同时选择多张照片拖拽,然后按下 Home 键回到 Home Screen,此时你拖拽的照片依然处于悬浮状态,只要你不松手,然后打开 Mail,在编辑框中放开那一堆照片,这些照片就会乖乖的按顺序粘贴到编辑框中了~

在分屏模式下使用 Drag and Drop

注意,跨 App 的 Drag and Drop 只能在 iPad 上使用,iPhone 只支持 App 内的 Drag and Drop。

如何使用

被拖拽的 Object 都来自被称为 源 app 的地方,而拖拽的目标地点被称为 目标 app,拖拽使用一个系统提供的手势服务被称作 Drag Activity,一个 Drag Session 由系统管理并由用户操作。
当拖拽的动作正在执行时,用户可以执行其他操作,例如调出 Dock 栏、按下 Home 键、创造分屏等。

系统将自动处理所有安全问题,你无需为安全性考虑,也不用在 Info.plist 中添加任何键值。

Coding

在一切开始前,你需要创建一个工程,然后让默认的 ViewController 遵守 Drag 操作需要的 UIDragInteractionDelegate 协议,和 Drop 操作需要的 UIDropInteractionDelegate,或是任何你准备用来使能 Drag and Drop 的视图控制器。

把 Photos 中或任何一处的照片拖拽到你的 App 中

要完成这个操作,你至少要让你的控制器遵守 UIDropInteractionDelegate 协议。

在 UITextView、UITableView 和 UICollectionView 中,分别有属于它们自己的特别定制的协议,详情见他们的 Reference,这里暂不做介绍

让一个 View 成为 Drop 目标(Drop destination)

所有 UIView 或子类的对象都可以成为 Drop 目标,你需要执行这三个步骤:
1.创建一个 UIDropInteraction 对象
2.指定 drop interaction 的代理,所需要的协议是 UIDropInteractionDelegate
3.把 drop interaction 对象添加给 Drop destination 的 interactions 属性

上面的步骤,你用如下代码就可以完成:

/// 把这个方法放在视图控制器中方便调用
/// 这里的 view 指你自己创建的 drop destination
func customEnableDropping(on view: UIView, dropInteractionDelegate: UIDropInteractionDelegate) {
    let dropInteraction = UIDropInteraction(delegate: dropInteractionDelegate)
    view.addInteraction(dropInteraction)
}

告诉系统和用户,拖拽的物体能否支持 Drop

当用户把某一个物体拖拽到 Destination App 的 destination view 里而并未放开手指时,系统会调用 dropInteraction(_:canHandle:) 代理方法,这个方法有一个 Bool 类型的返回值,用来告诉系统这个物体能否支持你的 App,如果支持,在 UI 上会显示一个原谅色的 + 号提醒用户可以在这里 let them go。

func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
    // 用来确定传入的物体是否是 UIImage 对象
    return session.canLoadObjects(ofClass: [UIImage.self])
}

提供一个必须的 Drop 建议(Proposal)

为了从一个 Session 中接受数据,你必须实现 dropInteraction(_:sessionDidUpdate) 的协议方法。

func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
        // 让系统“拷贝”这个项目
        return UIDropProposal(operation: .copy)
}

当用户成功 Drop 后,把 Drop 的 Items 提取出来

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
    // 读取 items 数组并处理它们
    session.loadObjects(ofClass: UIImage.self) { imageItems in
        let images = imageItems as! [UIImage]
        self.imageView.image = images.first
    }
}

现在,你应该拥有一个可以获取来自其他地方的照片的 App 了,而且是通过拖拽的方式!

最後で

接下来会慢慢更新 Drag and Drop 特性其他的部分,例如让你的 App 元素变得可以 Drag,而且还能够拖拽到别的地方,甚至另一个 App

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容