文章结构
- 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<UIDragItem *> *)tableView:(UITableView *)tableView itemsForBeginningDragSession:(id<UIDragSession>)session atIndexPath:(NSIndexPath *)indexPath;
该代理实现拖拽数据的构建。
drop必需实现的代理
- (void)tableView:(UITableView *)tableView performDropWithCoordinator:(id<UITableViewDropCoordinator>)coordinator;
该代理接收拖拽的数据。
demo里实现了类似支付宝重设扣款顺序的交互效果。
各个代理方法在demo里有所解释,请下载demo查看。
UICollectionView和UITableVIew类似。
UITextView/UITextField之Drag and Drop
可以直接进行拖拽,不需要进行任何代码处理,系统默认处理的UI交互已经做得很到位了。
自定义Drag and Drop View
只要是UIView类或者其子类都可以实现拖拽功能。
在UIView中有一个类别
@interface UIView (Interactions)
- (void)addInteraction:(id<UIInteraction>)interaction API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));
- (void)removeInteraction:(id<UIInteraction>)interaction API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));
@property (nonatomic, copy) NSArray<id<UIInteraction>> *interactions API_AVAILABLE(ios(11.0), watchos(5.0), tvos(13.0));
@end
该类别就是给UIView或其子类添加拖拽功能所需要的。
添加拖拽功能步骤如下:
- 给view添加UIDragInteraction、UIDropInteraction,UIDragInteraction允许view构建数据用于拖拽,UIDropInteraction允许view接收来自于拖拽的数据。demo里DragView只能构建数据用于拖拽,不能接收来自于拖拽的数据,DropView反之。
- 实现拖拽响应的代理方法。
UIDragInteraction重要的代理方法如下:
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session;
必须实现的代理方法,用于构建拖拽数据。
- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionAllowsMoveOperation:(id<UIDragSession>)session;
数据是否允许移动,这一般发生在同一app内,如果是跨app的拖拽则都是copy操作。
注意,该代理返回的值,直接影响UIDropInteraction代理方法
- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session;
里是否允许对拖拽数据进行移动处理。
UIDropInteraction重要的代理方法如下:
- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session;
能否处理该拖拽,一般在这里进行数据类型检查。
- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session;
对拖拽数据的处理方法,取消、禁止、拷贝、移动。如果是跨app间的处理必须都是copy。
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session;
接收拖拽数据。
demo里拖拽的数据都是NSString类型。能实现拖拽的数据类型必须遵循NSItemProviderWriting
和NSItemProviderReading
协议。系统已经默认实现了这两个协议的类有 NSString, NSAttributedString, NSURL, UIColor, UIImage
。
自定义控件的拖拽功能,目前在iphone上实现不了,iPad上没问题,没见相关官方文档说明。
Demo传送
参考文章:
Drag and Drop
网友评论