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;

   }];

}

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

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

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    99
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    58
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    88
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    134
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    40
  • 6
    iOS各个证书生成细节
    59
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    266
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    84
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    95
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    78
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等