浅谈iOS11新特性:新增拖拽交互体验

2020-01-21 02:59:45王冬梅

一、引言

在使用PC进行操作时,你一定遇到过这样的场景,可以将图片直接拖入聊天软件进行发送,可以将文档、音乐、视频文件等文件拖入相应应用程序直接进行使用。这种拖拽操作交互极大的方便了电脑的使用。在iOS11中,你可以在iPhone或iPad上构建这种交互体验!

说在前面的话:

拖拽操作在iPad上是支持跨应用程序的,你可以从一个应用中拖取项目,通过Home键回到主界面并且打开另一个应用程序,然后将被拖拽的项目传递给这个应用程序中。在iPhone上,拖拽操作只支持当前应用程序内,你可以将某个元素从一个界面拖拽到另一个,这种维度的操作可以给设计人员更大的灵活性。

拖拽操作被设计成系统管理,开发者不需要为App申请特殊的用户权限。   

二、拖拽源

对于拖拽操作,至少要有两个组件,一个组件作为拖拽源用来提供数据,一个组件作为拖拽目的用来接收数据,当前,同一个组件既可以是拖拽源也可以是拖拽目的。首先我们先来看拖拽源,在UIKit框架中,iOS11默认实现了一些组件可以作为拖拽源, 例如UITextField、UITextView、UITableView和UICollectionView等。文本组件默认支持拖拽操作进行文本的传递,对于列表组件则默认支持元素的拖拽。例如,在UITextField选中的文案中进行拖拽,可以将文字拖拽出来,效果如下图:

iOS11,拖拽交互,拖拽的交互

任意的UIView组件都可以作为拖拽源,让其成为拖拽源其实也十分简单,只需要3步:

1.创建一个UIDragInteraction行为对象。

2.设置UIDragInteraction对象的代理并实现相应方法。

3.将UIDragInteraction对象添加到指定View上。

最简单的可拖拽组件的创建示例代码如下:


- (void)viewDidLoad {
  [super viewDidLoad];
  [self.view addSubview:self.dragView];
}
//创建View
-(UIView *)dragView{
  if (!_dragView) {
    _dragView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    _dragView.backgroundColor = [UIColor redColor];
    [_dragView addInteraction:self.dragInteraction];
  }
  return _dragView;
}
//创建拖拽行为对象
-(UIDragInteraction *)dragInteraction{
  if (!_dragInteraction) {
    _dragInteraction = [[UIDragInteraction alloc]initWithDelegate:self];
    //要设置可用 注意!!!
    [_dragInteraction setEnabled:YES];
  }
  return _dragInteraction;
}

//实现提供数据的代理方法
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session{
  //数据提供者
  NSItemProvider * provider = [[NSItemProvider alloc]initWithObject:@"Hello World"];
  UIDragItem * item = [[UIDragItem alloc]initWithItemProvider:provider];
  return @[item];
}