1、Drag and Drop简介

  Drag and Drop是iOS11的新特性,可以将文本、图片进行拖拽到不同app中,实现数据的传递。只不过只能在iPad上使用,iPhone上只能app内部拖拽!

2、简单使用

  相关代码:

#import "ViewController.h"
#define CScreenWidth [[UIScreen mainScreen] bounds].size.width
#define CScreenHeight [[UIScreen mainScreen] bounds].size.height
#define ScreenHeight self.view.frame.size.height
#define ScreenWidth self.view.frame.size.width @interface ViewController ()<UIDragInteractionDelegate,UIDropInteractionDelegate> @property (nonatomic, strong)UIImageView *img;
@property (nonatomic, strong)UIImageView *img2; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.img =[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic4"]];
self.img.frame = CGRectMake(, , CScreenWidth-, );
self.img.userInteractionEnabled = YES;
[self.view addSubview:self.img];
//Drag发送数据,Drop接收数据
UIDragInteraction *dragInter = [[UIDragInteraction alloc] initWithDelegate:self];
dragInter.enabled = YES;
[self.img addInteraction:dragInter];
[self.view addInteraction:[[UIDropInteraction alloc] initWithDelegate:self]]; self.img2 =[[UIImageView alloc] init];
self.img2.frame = CGRectMake(, CScreenHeight-, CScreenWidth-, );
self.img2.userInteractionEnabled = YES;
[self.view addSubview:self.img2]; }
#pragma mark -UIDragInteractionDelegate
//提供数据源 开始拖拽
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session{
NSLog(@"11111----");
self.img2.image = nil;
NSItemProvider *item = [[NSItemProvider alloc] initWithObject:self.img.image];
UIDragItem *dragItem = [[UIDragItem alloc] initWithItemProvider:item];
dragItem.localObject = self.img.image;
return @[dragItem];
}
//提供preview相关信息
- (nullable UITargetedDragPreview *)dragInteraction:(UIDragInteraction *)interaction previewForLiftingItem:(UIDragItem *)item session:(id<UIDragSession>)session{
NSLog(@"22222----");
UIDragPreviewParameters *parameters = [[UIDragPreviewParameters alloc] init];
//设置蒙版mask
parameters.visiblePath = [UIBezierPath bezierPathWithRoundedRect:self.img.bounds cornerRadius:];
//设置在哪个父视图和哪个位置展示
UIDragPreviewTarget *target = [[UIDragPreviewTarget alloc] initWithContainer:self.img.superview center:self.img.center];
UITargetedDragPreview *dragePreview = [[UITargetedDragPreview alloc] initWithView:interaction.view parameters:parameters target:target];
return dragePreview;
}
//drag进行时
- (void)dragInteraction:(UIDragInteraction *)interaction willAnimateLiftWithAnimator:(id<UIDragAnimating>)animator session:(id<UIDragSession>)session{
NSLog(@"33333----");
[animator addCompletion:^(UIViewAnimatingPosition finalPosition) {
if (finalPosition == UIViewAnimatingPositionEnd) {
self.img.alpha = 0.5;
}
}];
}
//drag将要结束时调用
- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session willEndWithOperation:(UIDropOperation)operation{
NSLog(@"44444----");
[UIView animateWithDuration:0.5 animations:^{
self.img.alpha = ;
}];
}
//drag动画将要取消时
- (void)dragInteraction:(UIDragInteraction *)interaction item:(UIDragItem *)item willAnimateCancelWithAnimator:(id<UIDragAnimating>)animator{
NSLog(@"55555----");
[animator addAnimations:^{
self.img.alpha = .;
}];
}
//drag已经结束时调用
- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session didEndWithOperation:(UIDropOperation)operation{
NSLog(@"66666----");
[UIView animateWithDuration:0.5 animations:^{
self.img.alpha = ;
}];
} #pragma mark --UIDropInteractionDelegate
//是否可以接收来自Drag数据
- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session{
if(session.localDragSession == nil){//说明数据来自外界
}
return [session canLoadObjectsOfClass:[UIImage class]];
} //第二次判断是否可以接收 无法接收用UIDropOperationCancel
- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session{
UIDropOperation opera = session.localDragSession? UIDropOperationCopy:UIDropOperationCancel;
return [[UIDropProposal alloc] initWithDropOperation:opera];
} //取出来自drag的数据
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session{
if (session.localDragSession) {
NSProgress *pregesss = [session loadObjectsOfClass:[UIImage class]
completion:^(NSArray<__kindof id<NSItemProviderReading>> * _Nonnull objects) {
// 回调的代码块默认就在主线程
for (id objc in objects) {
UIImage *image = (UIImage *)objc;
if (image) {
self.img2.image = image;
}
}
}];
}
} @end

DragAndDrop.m文件

3、有关方法简介

  UIDragInteraction和Delegate方法:

@protocol UIDragInteractionDelegate, UIDragSession;
@class UIDragItem, UITargetedDragPreview;
API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @protocol UIDragAnimating <NSObject>
- (void)addAnimations:(void (^)(void))animations;
- (void)addCompletion:(void (^)(UIViewAnimatingPosition finalPosition))completion;
@end UIKIT_EXTERN API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @interface UIDragInteraction : NSObject <UIInteraction>
- (instancetype)initWithDelegate:(id<UIDragInteractionDelegate>)delegate NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@property (nonatomic, nullable, readonly, weak) id<UIDragInteractionDelegate> delegate;
@property (nonatomic) BOOL allowsSimultaneousRecognitionDuringLift;
@property (nonatomic, getter=isEnabled) BOOL enabled;
@property (class, nonatomic, readonly, getter=isEnabledByDefault) BOOL enabledByDefault;
@end API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @protocol UIDragInteractionDelegate <NSObject>
@required
//提供数据源 长按UI开始拖拽
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session;
@optional
//提供UITargetedDragPreview的相关信息 长按UI是有个lift(UI举起效果,系统自动生成)
//返回nil 没有效果; 不实现该方法 interaction.view自动生成UITargetedDragPreview
- (nullable UITargetedDragPreview *)dragInteraction:(UIDragInteraction *)interaction previewForLiftingItem:(UIDragItem *)item session:(id<UIDragSession>)session;
//drag发生时调用
- (void)dragInteraction:(UIDragInteraction *)interaction willAnimateLiftWithAnimator:(id<UIDragAnimating>)animator session:(id<UIDragSession>)session;
//将要开始drag
- (void)dragInteraction:(UIDragInteraction *)interaction sessionWillBegin:(id<UIDragSession>)session;
//是否允许数据移动 app内移动有效,跨app总是复制数据
- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionAllowsMoveOperation:(id<UIDragSession>)session;
//是否允许跨应用程序进行drag ipad
- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionIsRestrictedToDraggingApplication:(id<UIDragSession>)session;
//设置预览视图是否显示原始大小
- (BOOL)dragInteraction:(UIDragInteraction *)interaction prefersFullSizePreviewsForSession:(id<UIDragSession>)session;
//已经结束移动
- (void)dragInteraction:(UIDragInteraction *)interaction sessionDidMove:(id<UIDragSession>)session;
//drag将要结束时调用
- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session willEndWithOperation:(UIDropOperation)operation;
//drag已经结束时调用
- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session didEndWithOperation:(UIDropOperation)operation;
//拖拽源进行了放置操作后调用
- (void)dragInteraction:(UIDragInteraction *)interaction sessionDidTransferItems:(id<UIDragSession>)session;
//设置是否允许向拖拽中的项目添加数据 返回数据载体数组 drag时点击拖拽的组件调用
- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForAddingToSession:(id<UIDragSession>)session withTouchAtPoint:(CGPoint)point;
//设置允许进行拖拽中追加数据的拖拽行为会话
- (nullable id<UIDragSession>)dragInteraction:(UIDragInteraction *)interaction sessionForAddingItems:(NSArray<id<UIDragSession>> *)sessions withTouchAtPoint:(CGPoint)point;
//将要向拖拽组件中追加数据时调用
- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session willAddItems:(NSArray<UIDragItem *> *)items forInteraction:(UIDragInteraction *)addingInteraction;
//设置拖拽动作取消的视图动画 返回nil则消除动画
- (nullable UITargetedDragPreview *)dragInteraction:(UIDragInteraction *)interaction previewForCancellingItem:(UIDragItem *)item withDefault:(UITargetedDragPreview *)defaultPreview;
//drag动画将要取消时调用
- (void)dragInteraction:(UIDragInteraction *)interaction item:(UIDragItem *)item willAnimateCancelWithAnimator:(id<UIDragAnimating>)animator;

  UIDropInteraction和Delegate方法:

@protocol UIDragAnimating, UIDropInteractionDelegate, UIDropSession;
@class UIDragItem, UITargetedDragPreview; UIKIT_EXTERN API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @interface UIDropInteraction : NSObject <UIInteraction> - (instancetype)initWithDelegate:(id<UIDropInteractionDelegate>)delegate NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE; @property (nonatomic, nullable, readonly, weak) id<UIDropInteractionDelegate> delegate;
@property (nonatomic, assign) BOOL allowsSimultaneousDropSessions;
@end
typedef NS_ENUM(NSUInteger, UIDropOperation) {
UIDropOperationCancel = ,
UIDropOperationForbidden = ,
UIDropOperationCopy = ,
UIDropOperationMove = ,
} API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos); UIKIT_EXTERN API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @interface UIDropProposal : NSObject <NSCopying>
- (instancetype)initWithDropOperation:(UIDropOperation)operation NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@property (nonatomic, readonly) UIDropOperation operation;
@property (nonatomic, getter=isPrecise) BOOL precise;
@property (nonatomic) BOOL prefersFullSizePreview;
@end API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @protocol UIDropInteractionDelegate <NSObject> @optional
//是否可以处理来自Drag的数据
- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session;
//Drag的UI元素进入Drop的区域
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnter:(id<UIDropSession>)session;
//第二次判断是否可以接收 无法接收用UIDropOperationCancel
- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session;
//Drag的UI元素离开Drop的区域
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidExit:(id<UIDropSession>)session;
//取出来自drag的数据
NSLog(@"%f,%f",[session locationInView:self.view].x,[session locationInView:self.view].y)
- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session;
//drop结束
- (void)dropInteraction:(UIDropInteraction *)interaction concludeDrop:(id<UIDropSession>)session;
//整个Drag和Drop结束
- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnd:(id<UIDropSession>)session;
//手指松开,控制Drag Preview 如何自然的过渡到Drop之后的Preview
- (nullable UITargetedDragPreview *)dropInteraction:(UIDropInteraction *)interaction previewForDroppingItem:(UIDragItem *)item withDefault:(UITargetedDragPreview *)defaultPreview;
//手指松开Drop时,控制Drop区域的其他UI元素如何展示动画
- (void)dropInteraction:(UIDropInteraction *)interaction item:(UIDragItem *)item willAnimateDropWithAnimator:(id<UIDragAnimating>)animator;
@end

iOS开发Drag and Drop简介的更多相关文章

  1. iOS开发UI篇—CALayer简介

    iOS开发UI篇—CALayer简介   一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...

  2. HTML 5 drag and drop 简介

    Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...

  3. iOS开发多线程篇—多线程简介

    iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...

  4. iOS开发进阶--1.多线程简介

    学习是由已知的知识模型推理未知的知识模型的的过程. 本文适合学习完objective-c基础,想进一步提高做iOS开发的同学阅读. 在说线程的时候,我们先看看进程. 1.进程 每一个运行在系统中的应用 ...

  5. iOS开发多线程篇—GCD简介

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  6. iOS开发UITouch触摸API简介

    1.UITouch简介 当用户触摸屏幕时,会创建一个UITouch对象: UITouch的作用保存着触摸相关的信息,比如触摸的位置.时间.阶段等: 当从开始到结束,系统会更新UITouch对象,结束时 ...

  7. iOS开发:父子控制器简介:

    #import "ViewController.h" #import "ScoietyViewController.h" #import "HotVi ...

  8. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    文顶顶iOS开发博客链接整理及部分项目源代码下载   网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...

  9. IOS开发——使用数据库

    IOS开发——使用FMDB数据库 简介 需求作用: 如果需要保存大量的结构较为复杂的数据的时候,使用数据库,例如交规考试项目 1.数据库的基本介绍 数据库(DB)是一种数据模型组织起来并存放存储管理的 ...

随机推荐

  1. linux 下安装mysql5.7.17

    安装前的环境准备 linux 环境准备 内核参数建议值 1.调整最大文件数限制 直接执行 ulimit -n 65535 或写入/etc/sysctl.conf  重启后生效 2.修改IO 调度器设置 ...

  2. PHP headers_list() 函数

    定义和用法 headers_list() 函数返回已发送的(或待发送的)响应头部的一个列表. 该函数返回包含报头的数组. 语法 headers_list() 提示和注释 提示:如需确定是否已发送报头, ...

  3. delphi 不规则窗体与桌面宠物

    二.支持区域操作的编程接口在Windows的API函数中有一组用于区域操作的函数,可以用来生成区域.合并区域.获取区域数据.根据数据生成区域.把区域和窗体联系等,其中常用的几个函数有:生成矩形区域的C ...

  4. DELPHI读取网页源文件和获取字符串

    说到网页采集,通常大家以为到网上偷数据,然后把到收集到的数据挂到自己网上去.其实也可以将采集到的数据做为公司的参考,或把收集的数据跟自己公司的业务做对比等.目前网页采集多为3P代码为多(3P即ASP. ...

  5. Android 防止多次点击提交数据

    package com.test1.test; import android.app.Activity; import android.os.Bundle; import android.view.V ...

  6. window location跳转

    "top.location.href"是最外层的页面跳转"window.location.href"."location.href"是本页面 ...

  7. 中文linux安装oracle界面乱码解决方案

    来自:http://blog.csdn.net/h249059945/article/details/12122853 在linux的中文操作系统下使用xmanager进行oracle进行安装的时候, ...

  8. 使用kubeadm安装kubernetes 1.15

    1.主机准备篇 使用vmware Workstation 10创建一台虚拟机,配置为2C/2G/50G,操作系统为CentOS Linux release 7.6.1810 (Core). IP地址为 ...

  9. 我写的界面,在ARM上跑

    这个...其实,我对ARM了解并不多,我顶多也就算是知道ARM怎么玩,EMMC干啥,MMU干啥,还有早期的叫法,比如那个NorFlash NandFlash ,然后也就没啥了. 然后写个裸机什么的,那 ...

  10. Django ORM 之基于对象、双下划线查询

    返回ORM目录 Django ORM 内容目录: 一. 基于对象的表查询 二. 基于双下划线的查询 三. 聚合查询 aggregate 四. 分组查询 annotate 一. 基于对象的表查询 1.正 ...