iOS11新特性:新增拖拽交互体验(二)

简介: iOS11新特性:新增拖拽交互体验

五、放置目的地


   拖拽源是数据的提供者,放置目的地就是数据的接收者。前面我们也实验过,将自定义的拖拽源拖拽进UITextField后,文本框中会自动填充我们提供的文本数据。同样,对于任何自定义的UIView视图,我们也可以让其成为放置目的地,需要完成如下3步:


1.创建一个UIDropInteraction行为对象。


2.设置UIDropInteraction对象的代理并实现协议方法。


3.将其添加到自定义的视图中。


   例如,我们将自定义的UILabel组件用来显示拖拽的文案:


//添加视图

- (void)viewDidLoad {

   [super viewDidLoad];

   //有关拖拽源的代码 前面已经列举过 这里不再重复

   [self.view addSubview:self.dragView];

   [self.view addSubview:self.dropLabel];

}


-(UILabel *)dropLabel{

   if (!_dropLabel) {

       _dropLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 300, 300, 30)];

       _dropLabel.backgroundColor = [UIColor greenColor];

       _dropLabel.userInteractionEnabled = YES;

       [_dropLabel addInteraction:self.dropInteraction];

   }

   return _dropLabel;

}

//放置目的地行为对象

-(UIDropInteraction*)dropInteraction{

   if (!_dropInteraction) {

       _dropInteraction = [[UIDropInteraction alloc]initWithDelegate:self];

   }

   return _dropInteraction;

}


//这个方法返回是否响应此放置目的地的放置请求

-(BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session{

   return YES;

}

//设置以何种方式响应拖放会话行为

-(UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session{

   return [[UIDropProposal alloc]initWithDropOperation:UIDropOperationCopy];

}

//已经应用拖放行为后执行的操作

-(void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session{

 

   [session loadObjectsOfClass:[NSString class] completion:^(NSArray<__kindof id<NSItemProviderReading>> * _Nonnull objects) {

       self.dropLabel.text = objects.firstObject;

   }];

}

上面的代码将我们自定义的拖拽源提供的Hello World拖放进了UILabel组件中。


六、关于UIDropInteraction类


   与UIDragInteraction类类似,这个类的作用是让组件有相应放置操作的能力。其中属性如下:


//初始化方法

- (instancetype)initWithDelegate:(id<UIDropInteractionDelegate>)delegate;

//代理对象

@property (nonatomic, nullable, readonly, weak) id<UIDropInteractionDelegate> delegate;

//是否允许多个交互行为

@property (nonatomic, assign) BOOL allowsSimultaneousDropSessions;

七、UIDropInteractionDelegate协议


   UIDropInteractionDelegate协议中所定义的方法全部是可选实现的,其用来处理用户放置交互行为。


//放置行为即将响应时触发的方法 返回值确定是否响应此次行为

- (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);

九、UIDropSession与UIDragSession


   在与拖拽交互相关的接口中,这两个是面向协议编程的绝佳范例,首先在UIKit框架中只定义了这两个协议,而并没有相关的实现类,在拖拽行为的相关回调接口中,很多id类型的参数都遵守了这个协议,我们无需知道是哪个类实现的,直接进行使用即可:


UIDropSession:


//继承于UIDragDropSession(提供基础数据), NSProgressReporting(提供数据读取进度)

@protocol UIDropSession <UIDragDropSession, NSProgressReporting>

//原始的dragSesstion会话  如果是跨应用的 则为nil

@property (nonatomic, readonly, nullable) id<UIDragSession> localDragSession;

//设置进度风格

/*

typedef NS_ENUM(NSUInteger, UIDropSessionProgressIndicatorStyle) {

   UIDropSessionProgressIndicatorStyleNone,       // 无

   UIDropSessionProgressIndicatorStyleDefault,    // 默认的

} API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);


*/

@property (nonatomic) UIDropSessionProgressIndicatorStyle progressIndicatorStyle;

//进行数据的加载

- (NSProgress *)loadObjectsOfClass:(Class<NSItemProviderReading>)aClass completion:(void(^)(NSArray<__kindof id<NSItemProviderReading>> *objects))completion;


@end

UIDragSession:


API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @protocol UIDragSession <UIDragDropSession>

//设置要传递的额外信息 只有在同个APP内可见

@property (nonatomic, strong, nullable) id localContext;


@end

UIDragDropSession:


//传递的数据数组

@property (nonatomic, readonly) NSArray<UIDragItem *> *items;

//当前操作行为的坐标

- (CGPoint)locationInView:(UIView *)view;

//此次行为是否允许移动操作

@property (nonatomic, readonly) BOOL allowsMoveOperation;

//是否支持应用程序层面的拖拽

@property (nonatomic, readonly, getter=isRestrictedToDraggingApplication) BOOL restrictedToDraggingApplication;

//验证传递的数据是否支持某个数据类型协议

- (BOOL)hasItemsConformingToTypeIdentifiers:(NSArray<NSString *> *)typeIdentifiers;

//验证传递的数据是否可以加载某个类

- (BOOL)canLoadObjectsOfClass:(Class<NSItemProviderReading>)aClass;

目录
相关文章
|
7月前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
4月前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度解析
在移动操作系统的战场上,安卓和iOS一直占据着主导地位。本文将深入探讨这两大平台的核心技术特性,以及它们如何影响用户的体验。我们将从系统架构、应用生态、安全性能和创新功能四个方面进行比较,帮助读者更好地理解这两个系统的异同。
82 3
|
6月前
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异性:平台特性与用户体验的深度剖析
【7月更文挑战第27天】在移动应用开发的广阔天地中,Android和iOS两大阵营各自占据半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异,从编程语言、工具集到用户界面设计原则,以及它们如何影响最终的用户体验。通过对比分析,我们将揭示每个平台的独特优势,并讨论如何在这些差异中寻找平衡点,以实现跨平台的成功。
|
2月前
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
2月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
58 9
|
2月前
|
安全 定位技术 数据安全/隐私保护
深入探索iOS 15新特性:用户体验与隐私保护的革新
本文将深入探讨苹果公司最新操作系统iOS 15带来的创新功能,特别是那些对用户日常体验和数据隐私产生重大影响的特性。我们将重点分析FaceTime的新功能、通知管理的改进、以及隐私保护的增强措施,展示这些更新如何提升用户的生活质量和信息安全。
|
4月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
128 6
|
3月前
|
开发工具 Android开发 iOS开发
移动应用开发的艺术:探索Android与iOS的操作系统特性
【9月更文挑战第33天】在数字时代的浪潮中,移动应用已成为我们日常生活不可或缺的一部分。本文将深入探讨两个主流移动操作系统——Android和iOS——的独特特性,并分析它们如何影响移动应用的开发过程。我们将通过比较这两个系统的设计哲学、用户界面(UI)设计、开发工具以及市场策略,来揭示开发者如何在这些不同的平台上打造出色的用户体验。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解。
|
4月前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度剖析
在移动操作系统的战场上,安卓和iOS一直是两个重量级选手。本文将深入探讨两者的技术架构、安全性、应用生态以及用户体验等方面的差异,并尝试从用户和开发者的角度出发,分析这两个系统的优势与不足。通过比较,我们不仅能更好地理解各自的特点,还能洞察未来移动技术的发展趋势。
78 3
|
6月前
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异:平台特性与用户体验
【7月更文挑战第30天】在移动应用开发的广阔天地中,Android与iOS两大平台各自展现出独特的魅力与挑战。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及发布流程等方面的主要差异,旨在为开发者提供一个清晰的对比视角,帮助他们根据项目需求和目标受众做出更明智的开发决策。
59 13