【问题标题】:how to program drag and drop with snap to area in Objective-C for IOS如何在 iOS 的 Objective-C 中使用对齐区域编程拖放
【发布时间】:2012-03-03 05:25:25
【问题描述】:

我希望在 Objective-C 中为 IOS 平台实现一些东西。

我想要两个 GUI 对象,为了简单起见,假设它们是 UIImages 并且是正方形。

然后我有一个“空”的 GUI 元素,它只是一个相同大小的灰色正方形。

我希望用户能够将其中一张方形图像拖到空方格上,只要图像的某些部分接触到空方格,它就会捕捉到该空方格并将其填满。如果他们将图像放到其他任何地方,它会以动画方式返回到原始位置。

我还希望有 2 个其他正方形图像和另一个空正方形,这样具有相同的交互,但每组 2 个图像和 1 个空正方形不能在彼此之间工作。即前两个图像只能放入第一个空方格中。

我假设我希望捕获一些放置事件,然后确定图像元数据是否与它被放置到的空方块匹配。

如果您知道任何代码示例或应用程序,我当然可以通过代码来理解,或者如果您有一些对象、事件和属性可以向我指出,那就太好了。

这不像应用程序那样适用于游戏,所以我不希望在任何游戏引擎中工作,但如果这是一种简单的方法,那么我完全赞成。

【问题讨论】:

    标签: ios objective-c drag-and-drop


    【解决方案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 的最佳方法。
    • 我添加了一个如何将其移回的示例。这有帮助吗?
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多