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

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


//放置行为即将响应时触发的方法 返回值确定是否响应此次行为
- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session;
//当上面的协议方法返回YES时会接着调用这个函数
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnter:(id<UIDropSession>)session;
//将要处理数据时回调的方法
/*
当数据源数据添加时,这个方法也会被重新调用 
这个函数需要返回一个处理行为方式UIDropProposal对象,这个我们后面再说
*/
- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session;
//放置行为相应结束的时候会调用此方法
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidExit:(id<UIDropSession>)session;
//这个方法当用户进行放置时会调用,可以从session中获取被传递的数据
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session;
//放置动画完成后会调用这个方法
- (void)dropInteraction:(UIDropInteraction *)interaction concludeDrop:(id<UIDropSession>)session;
//整个拖放行为结束后会调用
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnd:(id<UIDropSession>)session;
//下面这些方法用来自定义放置动画
//设置放置预览动画
- (nullable UITargetedDragPreview *)dropInteraction:(UIDropInteraction *)interaction previewForDroppingItem:(UIDragItem *)item withDefault:(UITargetedDragPreview *)defaultPreview;
//这个函数每当有一个拖拽数据项放入时都会调用一次 可以进行动画
- (void)dropInteraction:(UIDropInteraction *)interaction item:(UIDragItem *)item willAnimateDropWithAnimator:(id<UIDragAnimating>)animator;

需要注意,UIDropProposal类用来进行处理回执,属性方法解析如下:


//初始化方法
/*
typedef NS_ENUM(NSUInteger, UIDropOperation) {
  //取消这次行为
  UIDropOperationCancel  = 0,
  //拒绝行为
  UIDropOperationForbidden = 1,
  //接收拷贝数据
  UIDropOperationCopy   = 2,
  //接收移动数据
  UIDropOperationMove   = 3,
}
*/
- (instancetype)initWithDropOperation:(UIDropOperation)operation;
//处理方式
@property (nonatomic, readonly) UIDropOperation operation;
//精准定位
@property (nonatomic, getter=isPrecise) BOOL precise;
//设置是否展示完整的预览尺寸
@property (nonatomic) BOOL prefersFullSizePreview;

八、拖拽数据载体UIDragItem类

UIDragItem类用来承载要传递的数据。其通过NSItemProvider类来进行构建,传递的数据类型是有严格规定的,必须遵守一定的协议,系统的NSString,NSAttributeString,NSURL,UIColor和UIImage是默认支持的,你可以直接传递这些数据。

UIDragItem中提供的属性方法:


//初始化方法
- (instancetype)initWithItemProvider:(NSItemProvider *)itemProvider;
//数据提供者实例
@property (nonatomic, readonly) __kindof NSItemProvider *itemProvider;
//用来传递一些额外的关联信息
@property (nonatomic, strong, nullable) id localObject;
//用来自定义每个item添加时的预览动画
@property (nonatomic, copy, nullable) UIDragPreview * _Nullable (^previewProvider)(void);