SEDraggable 1.0.0

SEDraggable 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布时间最后发布时间2014年12月

未声明 维护。



  • 作者
  • bryn austin bellomy

这是什么

目前在 iPhone/iPad 应用中无法使用 Cocoa 的拖放类和协议。这真的很糟糕。实现 UIPanGestureRecognizer 实在是非常无聊。

SEDraggableUIView 的子类,填补了这一空白,使得您能轻松地为应用中的任何 UIView 添加拖放功能。

如何使用

将源文件添加到您的 Xcode 项目中。导入 SEDraggable.h 头文件。

#import "SEDraggable.h"

要初始化 SEDraggable 的实例,您可能需要使用以下之一:

- (id) initWithFrame:(CGRect)frame;
- (id) initWithImage:(UIImage *)image andSize:(CGSize)size;
- (id) initWithImageView:(UIImageView *)imageView;
// set up the UIImageView that will be used as the visible component of our draggable element
UIImage *image = [[UIImage alloc] initWithContentsOfFile:@"someFile.png"];
UIImageView *imageView = [UIImageView alloc] initWithImage:image];

// initialize the draggable element itself
SEDraggable *draggableView = [SEDraggable initWithImageView:imageView];

当然,如前所述,还有更简单的初始化方法来满足不同的需求。

CGRect frame = CGRectMake(10, 10, 100, 100);
SEDraggable *draggableView = [SEDraggable initWithFrame:frame];
// ... or ...
SEDraggable *draggableView = [SEDraggable init];

使用 SEDraggableLocation 来管理自动行为

SEDraggableLocation 允许您轻松地在某些自动行为之间切换 -- 例如,直观地排列一组 SEDraggable 对象,使它们看起来不是随意散布的,或者在拖放操作因某些原因失败时,将 SEDraggable 拖回其原始位置。

尝试以下操作。运行代码后,与可拖动的对象交互,以查看它们的动态。

SEDraggable *draggableView = ...

// create the SEDraggableLocation to represent the draggable element's starting point
CGRect homeLocationBounds = CGRectMake(10, 10, 100, 100);
CGRect otherLocationBounds = CGRectMake(200, 200, 100, 100);
SEDraggableLocation *homeLocation = [SEDraggableLocation initWithBounds:homeLocationBounds];
SEDraggableLocation *otherLocation = [SEDraggableLocation initWithBounds:otherLocationBounds];

// configure a whole litany of options
otherLocation.objectWidth = draggableView.frame.size.width;
otherLocation.objectHeight = draggableView.frame.size.height;
otherLocation.marginLeft = 3;
otherLocation.marginRight = 3;
otherLocation.marginTop = 3;
otherLocation.marginBottom = 3;
otherLocation.marginBetweenX = 3;
otherLocation.marginBetweenY = 3;
otherLocation.shouldAcceptDroppedObjects = YES;
otherLocation.shouldAutomaticallyRecalculateObjectPositions = YES;
otherLocation.shouldAnimateObjectAdjustments = YES;
otherLocation.animationDuration = 0.5f;
otherLocation.animationDelay = 0.0f;
otherLocation.animationOptions = UIViewAnimationOptionBeginFromCurrentState;
otherLocation.fillHorizontallyFirst = YES; // NO makes it fill rows first
otherLocation.allowRows = YES;
otherLocation.allowColumns = YES;

// add the draggable object, or maybe even several
draggableView.homeLocation = homeLocation;
[draggableView addAllowedDropLocation:homeLocation];
[draggableView addAllowedDropLocation:otherLocation];
[homeLocation addDraggableObject:draggableView];

SEDraggableLocation 边界

您甚至可以指定 SEDraggableLocation 接受放置对象和放置它们的不同边界的位置。这两个区域甚至不必以任何方式连续!如果它们不是连续的,看看会发生什么也很酷 -- 当您放下可拖动的对象时,它们会自动从一个屏幕区域飞到另一个屏幕区域。

如果您想配置此类行为,以下两个属性是您需要注意的

@property (nonatomic, readwrite) CGRect responsiveBounds;
@property (nonatomic, readwrite) CGRect objectGutterBounds;

代理通知

您可以指定一个代理,该代理会收到相关的拖放事件。SEDraggableSEDraggableLocation 对象的代理必须分别符合 SEDraggableEventResponder 协议或 SEDraggableLocationEventResponder 协议。这两个协议定义以下消息,所有这些消息都是可选的

@protocol SEDraggableEventResponder

- (void) draggableObjectDidMove:(SEDraggable *)object;
- (void) draggableObjectDidStopMoving:(SEDraggable *)object;

- (void) draggableObject:(SEDraggable *)object didMoveWithinLocation:(SEDraggableLocation *)location;
- (void) draggableObject:(SEDraggable *)object didStopMovingWithinLocation:(SEDraggableLocation *)location;

- (void) draggableObjectWillSnapBackToHomeFrame:(SEDraggable *)object;
- (void) draggableObjectDidEndSnappingBackToHomeFrame:(SEDraggable *)object;

- (void) draggableObject:(SEDraggable *)object didBeginSnapAnimationWithID:(NSString *)animationID andContext:(void *)context;
- (void) draggableObject:(SEDraggable *)object didEndSnapAnimationWithID:(NSString *)animationID andContext:(void *)context;

@协议 SEDraggableLocationEventResponder

- (void) draggableLocation:(SEDraggableLocation *)location didAcceptDroppedObject:(SEDraggable *)object;
- (void) draggableLocation:(SEDraggableLocation *)location didRefuseDroppedObject:(SEDraggable *)object;
- (void) draggableObject:(SEDraggable *)object wasRemovedFromLocation:(SEDraggableLocation *)location;

作者和贡献者

bryn austin bellomy <[email protected]>

许可证(MIT许可证)

版权所有(c)2012 bryn austin bellomy, http://signals.io/

任何人可以免费获得此软件及其相关文档(以下称为“软件”)的副本,并且可以不受限制地处理软件,包括但不限于以下权利:使用、复制、修改、合并、发布、分发、再许可和/或出售软件的副本,并允许向软件提供的人这样做,只要遵守以下条件:

上述版权声明和本许可声明应包含在所有副本或软件的实质性部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于对适销性、适用于特定目的和未侵犯的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他原因,无论是在软件或与软件的使用或其他处理有关的任何事件中产生的,或在其中产生、出于或与之有关。