【问题标题】:Drag UIImageView and Drop in another UIImageView将 UIImageView 拖放到另一个 UIImageView 中
【发布时间】:2016-07-26 02:04:53
【问题描述】:

我有一个 UIScrollView,其中包含 n 个占位符 UIImageView。下面我有一个包含 10 个图像的 StackView,用户将从中选择并将图像拖动到上面的特定占位符图像视图。我已经实现了 PanGesture 并且效果很好,但是,我正在努力解决如何检测可拖动图像何时在占位符图像的范围内。特别是因为它在滚动视图中。我能够得到一些与可拖动视图的 center.X 和 center.Y 一起使用的功能,然后将这些值与它们的占位符的相对值进行比较,但它没有按预期工作。从我所见,拖动的 X 和 Y 坐标仅适用于实际的父 UIView。因此,当图像被拖入滚动视图时,X 值不一定对齐,如果列表很长,其中一些占位符图像 X 坐标可能是 2000+。看看下面的代码,让我知道你的想法和建议。谢谢!

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(self.view)

    if recognizer.state == UIGestureRecognizerState.Began {
        originalViewLocation = recognizer.view!.center
    }else if recognizer.state == UIGestureRecognizerState.Ended {
        for placeHolderView in playerImages{
            if ((recognizer.view!.center.x < (placeHolderView.center.x + (placeHolderView.frame.width / 2)) && recognizer.view!.center.x > placeHolderView.frame.origin.x)){
                if recognizer.view!.center.y < (stackView.center.y + stackView.frame.height / 2){
                    let chosenImage = recognizer.view! as! UIImageView
                    placeHolderView.image = chosenImage.image
                }
            }else{
                UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: {
                    recognizer.view!.center = self.originalViewLocation
                    }, completion: { finished in
                })
            }
        }
    }
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
                              y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPointZero, inView: self.view)
    print("X: \(recognizer.view!.center.x)")
    print("Y: \(recognizer.view!.center.y)")
}

playerImages 数组将 UIImageViews 存储在滚动视图中。

【问题讨论】:

    标签: ios swift uiscrollview uiimageview


    【解决方案1】:

    好吧,我确实自己解决了这个问题。它与相对坐标值与实际坐标值有关。

    我最终需要一些东西......

    CGRectContainsPoint()
    

    检查目标占位符视图的框架是否包含拖动视图的中心点。

    还有……

    convertRect()
    

    convertPoint()
    

    我必须将拖动点的坐标值转换为超级视图的值。同时,将滚动视图中占位符视图的帧值转换为相同的(超级视图值)。就这样……

    let convertedCenter = recognizer.view!.superview!.convertPoint(recognizer.view!.center, toView: self.view)
    let convertedFrame = self.view.convertRect(IV.frame,fromView: IV.superview)
    if CGRectContainsPoint(convertedFrame, convertedCenter) {
         //Replace placeholder image with dragged image.
    }
    

    希望这对其他人有帮助。

    【讨论】:

    • 嘿@thevalyreangroup,我也需要同样的东西。请分享一些演示项目。
    • 好的,今天晚些时候我会放一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多