如何在 iOS 的 Objective-C 中使用对齐区域编程拖放
Posted
技术标签:
【中文标题】如何在 iOS 的 Objective-C 中使用对齐区域编程拖放【英文标题】:how to program drag and drop with snap to area in Objective-C for IOS 【发布时间】:2012-03-03 05:25:25 【问题描述】:我希望在 Objective-C 中为 ios 平台实现一些东西。
我想要两个 GUI 对象,为了简单起见,假设它们是 UIImages 并且是正方形。
然后我有一个“空”的 GUI 元素,它只是一个相同大小的灰色正方形。
我希望用户能够将其中一张方形图像拖到空方格上,只要图像的某些部分接触到空方格,它就会捕捉到该空方格并将其填满。如果他们将图像放到其他任何地方,它会以动画方式返回到原始位置。
我还希望有 2 个其他正方形图像和另一个空正方形,这样具有相同的交互,但每组 2 个图像和 1 个空正方形不能在彼此之间工作。即前两个图像只能放入第一个空方格中。
我假设我希望捕获一些放置事件,然后确定图像元数据是否与它被放置到的空方块匹配。
如果您知道任何代码示例或应用程序,我当然可以通过代码来理解,或者如果您有一些对象、事件和属性可以向我指出,那就太好了。
这不像应用程序那样适用于游戏,所以我不希望在任何游戏引擎中工作,但如果这是一种简单的方法,那么我完全赞成。
【问题讨论】:
【参考方案1】:您可以很容易地做到这一点。在图像上附加一个UILongPressGestureRecognizer
,然后在 action 方法中,根据手指移动更新图像的位置。使用- (CGPoint)locationInView:(UIView *)
获取手势的当前位置。每次移动时,您都可以检查图像框架是否与目标区域的框架重叠,如果重叠,则将其对齐到位。
检查重叠相当简单(假设图像和目标都是同一视图层次结构的一部分):
CGRect imageRect = [image convertRect:image.frame toView:[image superview]];
CGRect targetRect = [target convertRect:target.frame toView:[image superview]];
if (CGRectIntersectsRect(imageRect, targetRect))
// overlap
如果用户掉到外面,要向后移动图像,您可以将帧或中心动画返回到原始位置。因此,当拖动开始时,将调用您的操作方法。您检查您的实例变量,我们将其命名为 originalCenter,是否不等于 CGPointZero
。如果是,则将当前中心记录到 originalCenter 中。
然后,当用户放下图像并且它超出目标时,您将其移回:
[UIView animateWithDuration:0.2
animations:^
image.center = originalCenter;
self.originalCenter = CGPointZero;
];
【讨论】:
谢谢帕斯卡。我有几个后续问题。如果我只想在用户放下时进行那个相交调用,我应该在什么事件中进行相交比较?它会在我拖动的图像中还是在我要放入的正方形中?如果用户掉到我的空白方块之外,是否有一些预制动画我可以调用来告诉图像返回到什么 X.Y 以及使用动画或移动速度? 我在 Stack Overflow 上发现了几篇文章,其中包含我正在寻找的一些组件。我想知道我是否在 UIImage 中放入了 touchesEnded 方法,并查看该触摸的 X.Y 是否在正确空方格的 CGRect 中。然后此时将图像视图左上角的 X.Y 设置为空正方形的左上角。我仍然需要找出让图像移回原始 X.Y 的最佳方法。 我添加了一个如何将其移回的示例。这有帮助吗?以上是关于如何在 iOS 的 Objective-C 中使用对齐区域编程拖放的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective-C 中使用继承(iOS sdk)
如何在 iOS 二进制文件中打印所有 Objective-C 类的名称?
如何使用 Objective-C 在 IOS 中读取和存储系统日志消息
如何在 iOS Objective-C 中集成“使用 Apple 登录”流程?
如何使用 AFNetworking 3.x 在 ios、objective-C 中使用来自 SOAP webservice 的数据