DNDDragAndDrop 1.4.0

DNDDragAndDrop 1.4.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2017年4月

Markus Gasser 维护。



  • Markus Gasser

iOS 拖放库

这是一个帮助您在 iOS 应用程序中支持拖放操作的库。该软件采用 MIT 许可证(请参阅 LICENSE 文件获取更多信息)。

安装

使用 CocoCaPods 进行安装,将以下内容添加到您的 Podfile

pod 'DNDDragAndDrop', '~> 1.4'

感谢 Hok Shun Poon 提供的 podspec。

用法

要与之交互的主要类是 DNDDragAndDropController。您需要向控制器提供两种视图进行操作

  • 拖动来源:这些是可以用来开始拖动操作的视图
  • 放置目标:这些是可以放置内容的视图

注册

注册时,您需要为两者提供一个代理。负责在屏幕上拖动视图并提供处理拖动操作取消的 DNDDragSourceDelegate。而 DNDDropTargetDelegate 则用于处理与放置目标相关的事件,例如用户将手指移入或移出放置目标的区域,或者一个视图刚刚被放置在目标上。

self.dragAndDropController = [[DNDDragAndDropController alloc] init];
[self.dragAndDropController registerDragSource:mySourceView withDelegate:self];
[self.dragAndDropController registerDropTarget:myDropTarget withDelegate:self];

如果需要,您可以为拖动操作提供自己的手势识别器。传递的识别器必须是一个连续的手势识别器(例如,UIPanGestureRecognizer)。

[self.dragAndDropController registerDragSource:mySourceView withDelegate:self dragRecognizer:myRecognizer];

默认情况下,使用 UIPanGestureRecognizer

拖动

为了交互,用户会开始在一个拖动源上平移,然后拖动源会请求代理提供一个在拖动时使用的视图。您使用在 DNDDragSourceDelegate 协议中声明的 -draggingViewForDragOperation: 方法提供它。

- (UIView *)draggingViewForDragOperation:(DNDDragOperation *)operation {
    // Create a drag view
    CGRect frame = CGRectMake(0.0f, 0.0f, 150.0f, 75.0f);
    UIView *dragView = [[UIView alloc] initWithFrame:frame];
    dragView.backgroundColor = [UIColor orangeColor];
    
    // Let it fade in
    dragView.alpha = 0.0f;
    [UIView animateWithDuration:0.2 animations:^{
        dragView.alpha = 1.0f;
    }];
    
    return dragView;
}

如果您想使被拖动的视图以动画方式出现,您可以直接在这个方法中这样做。

现在,用户可以在屏幕上移动拖动视图。当拖动视图进入或离开已注册的放置目标,将调用 DNDDropTargetDelegate 中的相应代理方法。例如,您可以在这些方法中更改目标视图的外观。

- (void)dragOperation:(DNDDragOperation *)operation didEnterDropTarget:(UIView *)target {
    target.layer.borderColor = [operation.draggingView.backgroundColor CGColor];
}

- (void)dragOperation:(DNDDragOperation *)operation didLeaveDropTarget:(UIView *)target {
    target.layer.borderColor = [[UIColor whiteColor] CGColor];
}

放置

当用户现在在某个位置放下拖动视图时,以下两种情况之一将发生。

如果拖动视图被放置在一个有效的放置目标上方,则放置目标的代理方法-dragOperation:didDropInDropTarget:将被调用。您可以使用此方法来实现视图在目标上释放时需要进行的任何操作,例如,例如动画拖动视图的移除。

- (void)dragOperation:(DNDDragOperation *)operation didDropInDropTarget:(UIView *)target {
    // Fade out
    [operation removeDraggingViewAnimatedWithDuration:0.2 animations:^(UIView *dv) {
        dv.alpha = 0.0f;
    }];
}

如果拖动视图被放置在任何有效放置目标之外,则取消拖动,并使用-dragOperationWillCancel:代理方法通知拖动源代理。与放置在目标上类似,您使用此方法来实现与取消拖动相关的任何操作,以及动画拖动视图的移除。

- (void)dragOperationWillCancel:(DNDDragOperation *)operation {
    [operation removeDraggingViewAnimatedWithDuration:0.2 animations:^(UIView *dv) {
        dv.alpha = 0.0f;
        dv.center = self.dragSourceView.center; // jump back to the source view
    }];
}

移除拖动视图

要移除一个拖动视图(在-dragOperation:didDropInDropTarget:或在-dragOperationWillCancel:中),您可以在DNDDragOperation有几种选择。

如果您在方法返回之前不做任何操作,则默认情况下,对于两种方法都会调用-removeDraggingView操作,从而在不进行动画的情况下移除拖动视图。

如果您想进行动画,则可以使用-removeDraggingViewAnimatedWithDuration:animations:,这允许您传递一个动画块。

第三,对于大多数控制,您可以使用-beginRemovingDraggingView/-completeRemovingDraggingView方法对。一旦调用-beginRemovingDraggingView,则拖动视图被认为是“正在移除”,并且您可以在没有默认操作发生的情况下从方法返回。然后您可以在任何时间点通过调用-completeRemovingDraggingView来移除拖动视图。如果需要链式动画,这可能很有用。

示例

请查看iOS Sample Application项目,其中包含一些简单的拖放操作示例。