iOS Drag And Drop使用

文章结构

  • drag and drop简介
  • tableView之Drag and Drop
  • UITextView/UITextField之Drag and Drop
  • 自定义Drag and Drop View

drag and drop简介

翻译过来就是拖拽,可以将数据从屏幕一个地方拖拽到另外一个地方,可以在同一个app内实现拖拽,也可以跨app实现数据拖拽。

所有的拖拽功能在iPad上都可用,在iPhone上拖拽只能在同一个app内。

tableView之Drag and Drop

打开tableView的拖拽功能,代码如下:

self.tableView.dragInteractionEnabled = YES;//打开拖拽功能
//实现拖拽的代理
self.tableView.dragDelegate = self;
self.tableView.dropDelegate = self;

drag必须实现的代理方法:

- (NSArray *)tableView:(UITableView *)tableView itemsForBeginningDragSession:(id)session atIndexPath:(NSIndexPath *)indexPath;

该代理实现拖拽数据的构建。

drop必需实现的代理

- (void)tableView:(UITableView *)tableView performDropWithCoordinator:(id)coordinator;

该代理接收拖拽的数据。

demo里实现了类似支付宝重设扣款顺序的交互效果。
各个代理方法在demo里有所解释,请下载demo查看。
UICollectionView和UITableVIew类似。

UITextView/UITextField之Drag and Drop

可以直接进行拖拽,不需要进行任何代码处理,系统默认处理的UI交互已经做得很到位了。

自定义Drag and Drop View

只要是UIView类或者其子类都可以实现拖拽功能。
在UIView中有一个类别

@interface UIView (Interactions)

- (void)addInteraction:(id)interaction API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));
- (void)removeInteraction:(id)interaction API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));

@property (nonatomic, copy) NSArray> *interactions API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));

@end

该类别就是给UIView或其子类添加拖拽功能所需要的。
添加拖拽功能步骤如下:

  1. 给view添加UIDragInteraction、UIDropInteraction,UIDragInteraction允许view构建数据用于拖拽,UIDropInteraction允许view接收来自于拖拽的数据。demo里DragView只能构建数据用于拖拽,不能接收来自于拖拽的数据,DropView反之。
  2. 实现拖拽响应的代理方法。

UIDragInteraction重要的代理方法如下:

- (NSArray *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id)session;

必须实现的代理方法,用于构建拖拽数据。

- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionAllowsMoveOperation:(id)session;

数据是否允许移动,这一般发生在同一app内,如果是跨app的拖拽则都是copy操作。

注意,该代理返回的值,直接影响UIDropInteraction代理方法- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id)session; 里是否允许对拖拽数据进行移动处理。

UIDropInteraction重要的代理方法如下:

- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id)session;

能否处理该拖拽,一般在这里进行数据类型检查。

- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id)session;

对拖拽数据的处理方法,取消、禁止、拷贝、移动。如果是跨app间的处理必须都是copy。

- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id)session;

接收拖拽数据。

demo里拖拽的数据都是NSString类型。能实现拖拽的数据类型必须遵循NSItemProviderWritingNSItemProviderReading协议。系统已经默认实现了这两个协议的类有 NSString, NSAttributedString, NSURL, UIColor, UIImage

自定义控件的拖拽功能,目前在iphone上实现不了,iPad上没问题,没见相关官方文档说明。
Demo传送

参考文章:
Drag and Drop

你可能感兴趣的:(iOS Drag And Drop使用)