浅谈iOS11新特性:新增拖拽交互体验

2020-01-21 02:59:45王冬梅

九、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;

十、交互预览类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;