美文网首页
iOS Drag And Drop使用

iOS Drag And Drop使用

作者: LotusLee | 来源:发表于2020-01-02 16:15 被阅读0次

    文章结构

    • 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或其子类添加拖拽功能所需要的。
    添加拖拽功能步骤如下:

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

    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类型。能实现拖拽的数据类型必须遵循NSItemProviderWritingNSItemProviderReading协议。系统已经默认实现了这两个协议的类有 NSString, NSAttributedString, NSURL, UIColor, UIImage

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

    参考文章:
    Drag and Drop

    相关文章

      网友评论

          本文标题:iOS Drag And Drop使用

          本文链接:https://www.haomeiwen.com/subject/fmbnoctx.html