引
无论是应用内, 应用外, 都能拖拽一张图片或者一段文字直接插入任何视图. 这是一个非常提升用户体验的的feature.
用户操作
用户操作流程如下, 分为两种将情况, 从应用内拖拽到应用内(同一篇文章中), 和 iPad分屏下的跨应用拖拽(应用外部).
可拖拽的对象: 文字, 图片, 链接
一. 在应用内部拖拽
- 环境: iPhone / iPad 单开应用
- 用户点击长按, 选中item ( 一段文字或者一张图片, 或者一个链接. )
- 拖动item中, 光标跟随着手指移动.
- 释放item, item落在光标处.
- 删除之前的item所在的位置, 结束
二. 在应用外拖拽
- 环境: iPad分屏
- 外部App点击长按, 选中item ( 一段文字或者一张图片, 或者一个链接. )
- 拖动item中,
- 移动到我们的App里面, 光标跟随着手指移动.
- 释放item, item落在光标处. 结束
UIDragItem
Drag必须实现的代理方法
数据类型必须遵循NSItemProviderWriting和NSItemProviderReading协议。系统已经默认实现了这两个协议的类有 NSString, NSAttributedString, NSURL, UIColor, UIImage。
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session {
// 获取item
NSItemProvider *provider1 = [[NSItemProvider alloc] initWithObject:self.img.image];
UIDragItem *dragItem1 = [[UIDragItem alloc] initWithItemProvider:provider1];
return @[dragItem,dragItem1];
}
UIDragSession
处理session的关键点
- 获取当前屏幕的pt
CGPoint pt = [session locationInView:self.view];
- 判断从内部或者外部拖入
session.localDragSession
UIDropInteraction
处理释放
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session