这是一个帮助您在 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项目,其中包含一些简单的拖放操作示例。