测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | Apache 2 |
发布最后发布 | 2016年10月 |
由 Nevyn Bengtsson,Nevyn Bengtsson 维护。
依赖 | |
Cerfing | = 2.0.4 |
MeshPipe/CerfingMeshPipe | = 0.1.3 |
CoreDragon 是一个用于 iOS 应用程序的拖放库。与使用上下文菜单、模态视图控制器、共享表单和其他“间接操作”方式移动数据相比,直接抓住你想移动的东西,然后将其拖放到你想放置的地方要直观得多。
CoreDragon 使用与 MacOS 上的拖放 API 类似的概念,并对它们进行了修改,以便在具有视图控制器世界中更好地工作。它在一个应用程序内工作,并在现代 iPad 上在分屏模式运行的应用程序之间工作。
CoreDragon 最初被称为 SPDragNDrop,是我于 2012 年 12 月 Spotify 的Hackweek实验的一个实验。由于我真的很喜欢这个主意,而且不想让代码+想法就这样腐朽掉,因此 Spotify 允许我在那里的工作结束后,在我那里以 Apache 2.0 许可下发布代码。
有关两个示例应用程序的演示介绍,这些应用程序展示了 Lookback 的全部功能集,请访问 https://lookback.io/watch/WfaXvq8vgWGPNYmxJ.
pod 'CoreDragon'
添加到您的 Podfilepod install
#import <CoreDragon/CoreDragon.h>
默认情况下,CoreDragon 使用长按并拖动手势来启动和执行拖动。要安装此默认手势,请从您的 Application Delegate 中调用 enableLongPressDraggingInWindow:
,如下所示
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[DragonController sharedController] enableLongPressDraggingInWindow:self.window];
return YES;
}
当您有一个您希望允许用户拖动的视图时,您可以用 -[DragonController registerDragSource:delegate:]
将其注册。您可能会在视图控制器的 viewDidLoad
中调用它,将该视图控制器作为代理。每当从此视图触发拖动操作时,就是您视图控制器负责提供被拖动对象的数据,通过将其放置在剪贴板上提供数据。
- (void)viewDidLoad
{
[super viewDidLoad];
[[DragonController sharedController] registerDragSource:label1 delegate:self];
}
- (void)beginDragOperation:(id<DragonInfo>)drag fromView:(UIView *)draggable
{
// Required: Provide the data to be dragged by adding it to the dragging info's pasteboard:
[drag.pasteboard setValue:text forPasteboardType:(NSString*)kUTTypePlainText];
// By default, the item being dragged is represented by a screenshot of the draggable view.
// Optionally, you can set 'title', 'subtitle' and 'draggingIcon' on the dragging info
// to give it a pretty icon.
NSString *text = [(UILabel*)draggable text];
drag.title = text;
drag.draggingIcon = [UIImage imageNamed:@"testimage"];
}
当拖动源被 deinited 时,会自动取消登记。
现在用户用手指拿起一个物体后,需要有一个地方放下它。您可以注册类似拖动源的方式注册目标对象。目标对象的委托协议有几种方法
一个简单的目标对象可能看起来是这样的
- (void)viewDidLoad
{
[super viewDidLoad];
[[DragonController sharedController] registerDropTarget:label2 delegate:self];
}
// Ensure that we only receive drops for plain text
- (BOOL)dropTarget:(UIView *)droppable canAcceptDrag:(id<DragonInfo>)drag
{
return [drag.pasteboard containsPasteboardTypes:@[(NSString*)kUTTypePlainText]];
}
// When some plain text is dropped on this target, set the label's text to the incoming text.
- (void)dropTarget:(UIView *)droppable acceptDrag:(id<DragonInfo>)drag atPoint:(CGPoint)p
{
[(UITextView*)droppable setText:[drag.pasteboard valueForPasteboardType:(NSString*)kUTTypePlainText]];
}
一个带有最简单拖放支持的“相框”应用程序。包含一个图像视图,可以在一个标签页中接受拖放,另一个标签页包含一些示例照片。
功能
这是一个支持文件夹的相册管理应用,展示了 CoreDragon 的所有功能。
照片在用户定义的顺序中排列在集合视图中。将照片拖放到另一张照片上会创建一个文件夹。照片可以来自相机胶卷或拖放到应用程序中。
功能
待实现
一个模拟聊天应用,演示了一些对话,您可以通过从 DragonPhotos 拖动照片将照片附加到聊天中。该应用程序的目的是展示拖放的真实世界用例。
我一直很喜欢多点触控。此外,我也喜欢与窗口和拖放进行空间操作。这两个概念在iPad上都没有获得足够的关注度,即使不探索这些概念也会错失很多。
在Spotify,我是通过复制Loren Brichter的堆叠窗格导航获得窗口的。最终,我有了触觉、直接的操纵导航。然而,所有上下文操作仍然在模式中执行。如果你想和一个朋友分享一首歌,你需要通过长按歌曲进入上下文菜单模式,然后再次通过在表格中选择一个选项进入分享模式,然后选择朋友模式……对我来说,直接抓住歌曲并将其拖到代表我的朋友的图标上会更加自然。突然间,你就可以取消所有这些模式,直接操作你的对象。
我在2012年的WWDC上遇到了我的英雄Bret Victor,我们谈了很久关于iPad上的拖放,他增加了一个我多年未考虑的重要观点:使用多点触控,你可以用一只手拿起东西,用另一只手导航。这个概念在2005年让我大吃一惊,当时TactaPad发布了几个令人惊叹的概念电影,然后再次消失。
所以,在2012年12月的Hackweek期间,我在Spotify的iPad应用内部制作了拖放。它效果非常好。你可以用右手拿起一首歌曲,用左手点击标签栏,通过用左手点击项或者用右手弹簧弹跳来在UI周围稍微导航一下,完成时放下你的项。
不幸的是,这个想法在公司内部没有得到任何推广,这个分支已经灭亡了。那是一年前的事情,代码现在无法编译。(是的,当你的构建系统每次更新Xcode的版本点时都会崩溃,代码确实会腐朽。)因此,我唯一拥有的截图是这个仓库中的 trivial demo app。希望这足以激发你现在感到需要在自己的应用中使用代码或这个概念!万岁!
在2015年WWDC之后,当分割屏幕多任务处理被引入时,我开始着手制作应用间的拖放。2015年8月31日的样子是这样的,2015年11月29日的进一步进展。
应用间的拖放从2016年年初开始发布,有一个在Lookback上的演示电影。