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

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

十、交互预览类UITargetedDragPreview


   UITargetedDragPreview专门用来处理拖放交互过程中的动画与预览视图。方法解析如下:


//创建一个预览对象

/*

view:要创建的预览视图 需要注意,这个视图必须在window上

param:配置参数

target:容器视图,用来展示预览,一般设置为view的父视图

*/

- (instancetype)initWithView:(UIView *)view parameters:(UIDragPreviewParameters *)parameters target:(UIDragPreviewTarget *)target;

//同上

-(instancetype)initWithView:(UIView *)view parameters:(UIDragPreviewParameters *)parameters;

//同上

- (instancetype)initWithView:(UIView *)view;

//动画承载者

@property (nonatomic, readonly) UIDragPreviewTarget* target;

//动画视图

@property (nonatomic, readonly) UIView *view;

//配置参数

@property (nonatomic, readonly, copy) UIDragPreviewParameters *parameters;

//尺寸

@property (nonatomic, readonly) CGSize size;

//返回新的对象

- (UITargetedDragPreview *)retargetedPreviewWithTarget:(UIDragPreviewTarget *)newTarget;

UIDragPreviewTarget主要用来设置动画的起始视图与结束时回归的视图,其中属性方法如下:


/*

初始化方法

container:必须是在window上的view

center:动画起点与终点

transform:进行变换

*/

- (instancetype)initWithContainer:(UIView *)container center:(CGPoint)center transform:(CGAffineTransform)transform;

//同上

- (instancetype)initWithContainer:(UIView *)container center:(CGPoint)center;

//对应属性

@property (nonatomic, readonly) UIView *container;

@property (nonatomic, readonly) CGPoint center;

@property (nonatomic, readonly) CGAffineTransform transform;

UIDragPreviewParameters用来进行拖拽动画的配置,解析如下:


//构造方法并设置路径矩形

- (instancetype)initWithTextLineRects:(NSArray<NSValue /* CGRect */ *> *)textLineRects;

//显示的路径

@property (nonatomic, copy, nullable) UIBezierPath *visiblePath;

//背景色

@property (nonatomic, copy, null_resettable) UIColor *backgroundColor;

我们可以使用任意自定义的视图来展现这个预览动画,如下图所示:


image.png


十一、使用拖拽操作进行自定义数据的传递


   本篇文章到这里,其实基本的内容都已经说完了,虽然比较详细,也可能难免冗余,如果你耐着性子看到了这里,那么我首先钦佩你的毅力并且感谢你的耐心。其实,拖拽交互如果进行只能对系统的提供的数据类型进行操作则应用就局限太多。试想一下,如果我们可以通过拖拽商品来进行购买,拖拽联系人来进行发送,或者在游戏中,拖拽进行卡片的融合,装备的提炼等等这种交互操作是不是会很畅快。最后,我们就来看看如何让自定义的数据类型支持拖拽操作。


   首先你需要关注两个协议,NSItemProviderWriting与NSItemProviderReading。Writing协议用来让数据支持提供给数据源,Reading协议让数据支持从数据源读出,用自定义的Person类为例:


#import <Foundation/Foundation.h>

//遵守协议

@interface Person : NSObject<NSItemProviderWriting,NSItemProviderReading>

//自定义内容

@property(nonatomic,strong)NSString * name;


@property(nonatomic,assign)NSUInteger age;


@end


//.m文件

@implementation Person

//数据归档

- (nullable NSProgress *)loadDataWithTypeIdentifier:(NSString *)typeIdentifier

                  forItemProviderCompletionHandler:(void (^)(NSData * _Nullable data, NSError * _Nullable error))completionHandler{

   NSProgress * pro = [NSProgress new];

   NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];

   completionHandler(data,nil);

   return pro;

}


+(NSItemProviderRepresentationVisibility)itemProviderVisibilityForRepresentationWithTypeIdentifier:(NSString *)typeIdentifier{

   return NSItemProviderRepresentationVisibilityAll;

}


- (NSItemProviderRepresentationVisibility)itemProviderVisibilityForRepresentationWithTypeIdentifier:(NSString *)typeIdentifier{

   return NSItemProviderRepresentationVisibilityAll;

}

//提供一个标识符

+(NSArray<NSString *> *)writableTypeIdentifiersForItemProvider{

   return @[@"object"];

}

-(NSArray<NSString *> *)writableTypeIdentifiersForItemProvider{

   return @[@"object"];

}


- (instancetype)initWithCoder:(NSCoder *)coder

{

   self = [super init];

   if (self) {

       self.name = [coder decodeObjectForKey:@"name"];

       self.age = [coder decodeIntegerForKey:@"age"];

   }

   return self;

}


- (void)encodeWithCoder:(NSCoder *)aCoder{

   [aCoder encodeObject:self.name forKey:@"name"];

   [aCoder encodeInteger:self.age forKey:@"age"];

}


//这两个是读协议

+(NSArray<NSString *> *)readableTypeIdentifiersForItemProvider{

   return @[@"object"];

}

//解归档返回

+ (nullable instancetype)objectWithItemProviderData:(NSData *)data

                                    typeIdentifier:(NSString *)typeIdentifier

                                             error:(NSError **)outError{

   Person * p = [NSKeyedUnarchiver unarchiveObjectWithData:data];

   return p;

}


@end

需要注意,在拖放行为读取数据时的类型要对应,如下:


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

   NSLog(@"%@",session.items.lastObject.localObject);

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

       self.dropLabel.text = ((Person*)objects.firstObject).name;

   }];

}

写了这么多,难免有疏漏与错误,欢迎指导交流

目录
相关文章
|
2月前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
24天前
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异性:平台特性与用户体验的深度剖析
【7月更文挑战第27天】在移动应用开发的广阔天地中,Android和iOS两大阵营各自占据半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异,从编程语言、工具集到用户界面设计原则,以及它们如何影响最终的用户体验。通过对比分析,我们将揭示每个平台的独特优势,并讨论如何在这些差异中寻找平衡点,以实现跨平台的成功。
|
21天前
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异:平台特性与用户体验
【7月更文挑战第30天】在移动应用开发的广阔天地中,Android与iOS两大平台各自展现出独特的魅力与挑战。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及发布流程等方面的主要差异,旨在为开发者提供一个清晰的对比视角,帮助他们根据项目需求和目标受众做出更明智的开发决策。
27 13
|
1月前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第19天】在移动开发的广阔天地中,安卓与iOS两大阵营各据一方,它们在开发环境、用户界面设计、性能优化等方面展现出独特的魅力与挑战。本文旨在深入探讨这两个平台在技术开发和用户体验上的根本差异,并分析这些差异如何影响开发者的策略和最终用户的选择。通过比较两者的编程语言、工具、框架以及设计理念,我们将揭示各自平台的优势与局限,为开发者提供实用的参考,并为消费者呈现一个更加清晰的平台选择视角。
|
1月前
|
监控 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性、工具和市场趋势
在移动应用开发的广阔舞台上,安卓与iOS两大操作系统扮演着主角。它们各自拥有独特的平台特性、开发工具和市场定位,这些差异深刻影响着开发者的决策和产品的最终形态。本文将深入分析这两大平台的关键技术差异,探讨各自的开发环境和工具集,以及它们在市场上的表现和未来的趋势,为开发者提供一个全面的视角,帮助他们在这两个平台上做出更明智的开发选择。
|
1月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性与编程实践
【7月更文挑战第8天】在移动开发的广阔天地中,安卓和iOS这两大操作系统各自占据着半壁江山。它们在用户界面设计、系统架构及开发工具上展现出截然不同的特色。本文将深入探讨这两个平台在技术实现和开发生态上的关键差异,并分享一些实用的开发技巧,旨在为跨平台开发者提供有价值的见解和建议。
|
23天前
|
数据安全/隐私保护 iOS开发 开发者
探索iOS 15中的隐私保护新特性
在数字化时代,个人隐私的保护日益成为公众关注的焦点。苹果公司一直以用户隐私安全为荣,其最新发布的iOS 15系统进一步加深了这一承诺。本文将深入探讨iOS 15中新增的隐私保护功能,分析它们如何增强用户的数据安全性,并讨论这些更新对应用开发者和终端用户的深远影响。
|
1月前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,安卓与iOS两大阵营各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、编程语言、用户界面设计以及性能优化方面的差异,并分析这些差异如何影响最终的用户体验。通过数据支持的案例分析和最新的市场研究,我们将揭示开发者如何在这两个不同的生态系统中做出战略决策,以及这些决策对应用成功的潜在影响。
|
2月前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
1月前
|
搜索推荐 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第9天】在移动应用开发的浩瀚海洋中,Android和iOS两大操作系统如同两座灯塔,指引着开发者们的航向。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场策略上的根本差异。我们将通过比较分析,揭示各自平台的独特优势和潜在挑战,为开发者提供决策支持,同时也为用户体验的提升指明方向。